Spring BeanDefinitionStoreException

1. Ikhtisar

Pada artikel ini, kita akan membahas Spring org.springframework.beans.factory.BeanDefinitionStoreException - ini biasanya merupakan tanggung jawab BeanFactory ketika definisi kacang tidak valid, pemuatan kacang itu bermasalah. Artikel ini akan membahas penyebab paling umum dari pengecualian ini bersama dengan solusi untuk masing-masing penyebab.

2. Penyebab: java.io.FileNotFoundException

Ada beberapa kemungkinan penyebab BeanDefinitionStoreException mungkin disebabkan oleh IOException yang mendasari :

2.1. IOException Parsing XML Document From ServletContext Resource

Ini biasanya terjadi di aplikasi Spring Web, saat DispatcherServlet disiapkan di web.xml untuk Spring MVC:

 mvc org.springframework.web.servlet.DispatcherServlet 

Secara default, Spring akan mencari file bernama persis springMvcServlet-servlet.xml di direktori / WEB-INF aplikasi web.

Jika file ini tidak ada, pengecualian berikut akan ditampilkan:

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 solusi ini tentu saja untuk memastikan MVC-servlet.xml file yang memang ada di bawah / WEB-INF ; jika tidak, maka sampel dapat dibuat:

2.2. IOException Parsing XML Document From Class Path Resource

Ini biasanya terjadi ketika sesuatu dalam aplikasi menunjuk ke sumber daya XML yang tidak ada, atau tidak ditempatkan di tempat yang seharusnya.

Menunjuk sumber daya semacam itu dapat terjadi dalam berbagai cara.

Menggunakan misalnya Konfigurasi Java, ini mungkin terlihat seperti:

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

Dalam XML, ini akan menjadi:

Atau bahkan dengan membuat konteks Spring XML secara manual:

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

Semua ini akan mengarah ke pengecualian yang sama jika file 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 solusi adalah membuat file dan menempatkannya di bawah / src / main / sumber direktori proyek - cara ini, file tersebut akan ada pada classpath dan itu akan ditemukan dan digunakan oleh Spring.

3. Penyebab: Tidak Dapat Menyelesaikan Placeholder…

Galat ini terjadi saat Spring mencoba untuk menyelesaikan properti tetapi tidak mampu - karena salah satu dari banyak kemungkinan alasan.

Tapi pertama-tama, penggunaan properti - ini dapat digunakan dalam XML:

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

Properti juga dapat digunakan dalam kode Java:

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

Hal pertama yang harus diperiksa adalah bahwa nama properti benar-benar cocok dengan definisi properti; dalam contoh ini, kita perlu menetapkan properti berikut:

some.property=someValue

Kemudian, kita perlu memeriksa di mana file properti didefinisikan di Spring - ini dijelaskan secara rinci di Properties saya dengan Tutorial Spring. Praktik terbaik yang dapat diikuti adalah memiliki semua file properti di bawah direktori / src / main / resources aplikasi dan memuatnya melalui:

"classpath:app.properties"

Beranjak dari yang sudah jelas - kemungkinan penyebab lain bahwa Spring tidak dapat menyelesaikan properti adalah mungkin ada beberapa biji PropertyPlaceholderConfigurer dalam konteks Spring (atau beberapa elemen placeholder properti )

Jika demikian, maka solusinya adalah menciutkannya menjadi satu, atau mengonfigurasinya dalam konteks induk dengan ignoreUnresolvablePlaceholder .

4. Penyebab: java.lang.NoSuchMethodError

Kesalahan ini muncul dalam berbagai bentuk - salah satu yang lebih umum 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 terjadi ketika ada beberapa versi Spring di classpath. Memiliki versi Spring yang lebih lama secara tidak sengaja di jalur kelas proyek lebih umum daripada yang dipikirkan orang - Saya menjelaskan masalah dan solusi untuk ini di artikel Keamanan Musim Semi dengan Maven.

Singkatnya, solusi untuk kesalahan ini sederhana - periksa semua stoples Spring di classpath dan pastikan semuanya memiliki versi yang sama - dan versi tersebut adalah 3.0 atau lebih tinggi.

Demikian pula, pengecualian tidak terbatas pada kacang MutablePropertyValues - ada beberapa inkarnasi 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. Penyebab: java.lang.NoClassDefFoundError

Masalah umum yang serupa dengan Maven dan dependensi 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 terjadi ketika fungsionalitas transaksional dikonfigurasi dalam konfigurasi XML:

The NoClassDefFoundError berarti bahwa dukungan Spring Transaksional - yaitu semi-tx - tidak ada pada classpath.

Solusinya sederhana - spring-tx perlu ditentukan di Maven pom:

 org.springframework spring-tx 4.1.0.RELEASE 

Tentu saja ini tidak terbatas pada fungsionalitas transaksi - kesalahan serupa muncul jika AOP juga hilang:

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

Jars yang sekarang dibutuhkan adalah: spring-aop (dan secara implisit aopalliance ):

 org.springframework spring-aop 4.1.0.RELEASE 

6. Kesimpulan

Di akhir artikel ini, kita harus memiliki peta yang jelas untuk menavigasi berbagai penyebab dan masalah yang dapat mengarah ke Pengecualian Penyimpanan Definisi Kacang serta pemahaman yang baik tentang cara memperbaiki semua masalah ini.

Penerapan beberapa contoh pengecualian ini dapat ditemukan di proyek github - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.