Spring BeanDefinitionStoreException

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membincangkan org.springframework.beans.factory.BeanDefinitionStoreException Spring - ini biasanya merupakan tanggungjawab BeanFactory apabila definisi kacang tidak sah, pemuatan kacang itu bermasalah. Artikel ini akan membincangkan sebab-sebab yang paling biasa dari pengecualian ini bersama-sama dengan penyelesaiannya.

2. Sebab: java.io.FileNotFoundException

Terdapat banyak kemungkinan penyebab bahawa BeanDefinitionStoreException mungkin disebabkan oleh IOException yang mendasari :

2.1. IOException Menghuraikan Dokumen XML Dari Sumber ServletContext

Ini biasanya berlaku dalam aplikasi Spring Web, apabila DispatcherServlet disiapkan di web.xml untuk Spring MVC:

 mvc org.springframework.web.servlet.DispatcherServlet 

Secara lalai, Spring akan mencari fail yang dipanggil tepat springMvcServlet-servlet.xml dalam direktori / WEB-INF aplikasi web.

Sekiranya fail ini tidak ada, maka pengecualian berikut akan dilemparkan:

org.springframework.beans.factory.BeanDefinitionStoreException: Ioexception Parsing Xml Document from Servletcontext Resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-servlet.xml]

The penyelesaian adalah kursus untuk memastikan MVC-servlet.xml fail memang wujud di bawah / WEB-INF ; jika tidak, maka sampel boleh dibuat:

2.2. Dokumen IOException Menghuraikan XML Dari Sumber Laluan Kelas

Ini biasanya berlaku apabila sesuatu dalam aplikasi menunjukkan sumber XML yang tidak ada, atau tidak diletakkan di tempat yang sepatutnya.

Menunjuk sumber seperti itu mungkin berlaku dalam pelbagai cara.

Menggunakan contohnya Konfigurasi Java, ini mungkin seperti:

@Configuration @ImportResource("beans.xml") public class SpringConfig {...}

Dalam XML, ini adalah:

Atau dengan membuat konteks Spring XML secara manual:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Semua ini akan membawa kepada pengecualian yang sama jika fail tidak ada:

org.springframework.beans.factory.BeanDefinitionStoreException: Ioexception Parsing Xml Document from Servletcontext Resource [/beans.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/beans.xml]

The penyelesaian adalah mewujudkan fail dan meletakkannya di bawah / src / sumber / main direktori projek - cara ini, fail akan wujud pada classpath dan ia akan ditemui dan digunakan oleh Spring.

3. Sebab: Tidak Dapat Menyelesaikan Pemegang Tempat…

Kesalahan ini berlaku semasa Spring berusaha menyelesaikan harta tanah tetapi tidak dapat - kerana salah satu daripada banyak kemungkinan sebab.

Tetapi pertama, penggunaan harta tanah - ini mungkin digunakan dalam XML:

... value="${some.property}" ...

Properti ini juga dapat digunakan dalam kode Java:

@Value("${some.property}") private String someProperty;

Perkara pertama yang perlu diperiksa ialah nama harta tanah itu betul-betul sesuai dengan definisi harta tanah; dalam contoh ini, kita perlu menentukan sifat berikut:

some.property=someValue

Kemudian, kita perlu memeriksa di mana fail sifat ditentukan pada musim bunga - ini dijelaskan secara terperinci dalam Properties with Spring Tutorial saya. Amalan terbaik yang baik untuk diikuti adalah memiliki semua fail sifat di bawah direktori / src / main / sumber aplikasi dan memuatkannya melalui:

"classpath:app.properties"

Beralih dari yang jelas - sebab lain yang mungkin Spring tidak dapat menyelesaikan harta tanah ialah mungkin terdapat banyak kacang PropertyPlaceholderConfigurer dalam konteks Spring (atau beberapa elemen place-placeholder )

Jika itu berlaku, maka penyelesaian sama ada runtuh ini ke dalam satu, atau mengkonfigurasi satu dalam konteks ibu bapa dengan ignoreUnresolvablePlaceholders .

4. Sebab: java.lang.NoSuchMethodError

Kesalahan ini terdapat dalam pelbagai bentuk - salah satu yang lebih biasa adalah:

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.MutablePropertyValues.add (Ljava/lang/String;Ljava/lang/Object;) Lorg/springframework/beans/MutablePropertyValues;

Ini biasanya berlaku apabila terdapat banyak versi Spring di lorong kelas. Mempunyai versi Spring yang lebih lama secara tidak sengaja di lorong kelas projek adalah lebih biasa daripada yang disangka - saya menerangkan masalah dan penyelesaiannya dalam artikel Spring Security with Maven.

Ringkasnya, penyelesaian untuk ralat ini adalah mudah - periksa semua balang Spring di lorong kelas dan pastikan semuanya mempunyai versi yang sama - dan versi itu 3.0 atau lebih tinggi.

Begitu juga, pengecualian tidak terhad kepada kacang MutablePropertyValues - terdapat beberapa penjelmaan lain dari masalah yang sama, yang disebabkan oleh ketidakkonsistenan versi yang sama:

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [/WEB-INF/mvc-servlet.xml]; - nested exception is java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible(Ljava/lang/reflect/Constructor;)V

5. Sebab: java.lang.NoClassDefFoundError

Masalah biasa, serupa dengan Maven dan pergantungan Spring yang ada adalah:

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor

Ini berlaku apabila fungsi transaksi dikonfigurasi dalam konfigurasi XML:

The NoClassDefFoundError cara bahawa sokongan Spring Transaksi - iaitu bunga-tx - tidak wujud pada classpath itu.

Penyelesaiannya mudah - spring-tx perlu ditentukan dalam Maven pom:

 org.springframework spring-tx 4.1.0.RELEASE 

Sudah tentu ini tidak terhad kepada fungsi urus niaga - ralat serupa juga dilontarkan sekiranya AOP hilang juga:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice

Botol yang diperlukan sekarang adalah: spring-aop (dan secara implisit aopalliance ):

 org.springframework spring-aop 4.1.0.RELEASE 

6. Kesimpulannya

Pada akhir artikel ini, kita harus mempunyai peta yang jelas untuk menavigasi pelbagai sebab dan masalah yang mungkin menyebabkan Pengecualian Kedai Kacang Kacang serta pemahaman yang baik tentang bagaimana menyelesaikan semua masalah ini.

Pelaksanaan beberapa contoh pengecualian ini dapat dijumpai dalam projek github - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.