Spring BeanDefinitionStoreException

Spring BeanDefinitionStoreException

1. Vue d'ensemble

Dans cet article, nous discuterons du Springorg.springframework.beans.factory.BeanDefinitionStoreException - c'est typiquement la responsabilité d'unBeanFactory lorsqu'une définition de bean est invalide, le chargement de ce bean est problématique. L'article discutera des causes les plus courantes de cette exception avec la solution pour chacune d'elles.

2. Cause:java.io.FileNotFoundException

Il existe plusieurs causes possibles pour lesquelles lesBeanDefinitionStoreException peuvent être causés par unIOException sous-jacent:

2.1. IOException Analyse du document XML à partir de la ressource ServletContext

Cela se produit généralement dans une application Web Spring, lorsqu'unDispatcherServlet est configuré dans leweb.xml pour Spring MVC:


   mvc
   org.springframework.web.servlet.DispatcherServlet

Par défaut, Spring recherchera un fichier appelé exactementspringMvcServlet-servlet.xml dans le répertoire/WEB-INF de l'application Web.

Si ce fichier n’existe pas, l’exception suivante sera générée:

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]

Lesolution est bien entendu pour s'assurer que le fichiermvc-servlet.xml existe bien sous/WEB-INF; si ce n’est pas le cas, un échantillon peut être créé:




2.2. IOException Analyse du document XML à partir de la ressource de chemin de classe

Cela se produit généralement lorsqu'un élément de l'application pointe vers une ressource XML qui n'existe pas ou qui n'est pas placée là où elle devrait être.

Le fait de pointer vers une telle ressource peut se produire de différentes manières.

En utilisant par exemple Java Configuration, ceci peut ressembler à:

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

En XML, ce sera:

Ou même en créant manuellement un contexte XML Spring:

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

Tous ces éléments entraîneront la même exception si le fichier n’existe pas:

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]

Lesolution crée le fichier et le place sous le répertoire/src/main/resources du projet - de cette façon, le fichier existera sur le chemin de classe et il sera trouvé et utilisé par Spring.

3. Cause:Could Not Resolve Placeholder …

Cette erreur se produit lorsque Spring essaie de résoudre une propriété mais ne peut pas le faire - pour l'une des nombreuses raisons possibles.

Mais d’abord, l’utilisation de la propriété - ceci peut être utilisé en XML:

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

La propriété pourrait également être utilisée en code Java:

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

La première chose à vérifier est que le nom de la propriété correspond réellement à la définition de la propriété; dans cet exemple, nous devons définir la propriété suivante:

some.property=someValue

Ensuite, nous devons vérifier où le fichier de propriétés est défini dans Spring - cela est décrit en détail dans mesProperties with Spring Tutorial. Une bonne pratique à suivre est d'avoir tous les fichiers de propriétés dans le répertoire/src/main/resources de l'application et de les charger via:

"classpath:app.properties"

Passant de l'évidence - une autre cause possible pour laquelle Spring n'est pas en mesure de résoudre la propriété est qu'il peut y avoirmultiple PropertyPlaceholderConfigurer beans dans le contexte Spring (ou plusieurs élémentsproperty-placeholder)

Si tel est le cas, alorssolution les réduit en un seul ou configure celui du contexte parent avecignoreUnresolvablePlaceholders.

4. Cause:java.lang.NoSuchMethodError

Cette erreur se présente sous différentes formes. L'une des plus courantes est:

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;

Cela se produit généralement lorsque le classpath comporte plusieurs versions de Spring. Avoir unolder version of Spring accidentally on the project classpath est plus courant qu'on ne le pense - j'ai décrit le problème et la solution pour cela dans leSpring Security with Maven article.

En bref, la solution à cette erreur est simple: vérifiez tous les fichiers Spring du chemin de classe et assurez-vous qu'ils ont tous la même version. Cette version est 3.0 ou supérieure.

De même, l'exception n'est pas limitée au beanMutablePropertyValues - il existe plusieurs autres incarnations du même problème, causées par la même incohérence de version:

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. Cause:java.lang.NoClassDefFoundError

Un problème commun, lié de manière similaire à Maven et aux dépendances Spring existantes, est le suivant:

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

Cela se produit lorsque la fonctionnalité transactionnelle est configurée dans la configuration XML:

LeNoClassDefFoundError signifie que la prise en charge de Spring Transactional - à savoirspring-tx - n'existe pas sur le chemin de classe.

La solution est simple -spring-tx doit être défini dans le pom Maven:


    org.springframework
    spring-tx
    4.1.0.RELEASE

Bien sûr, cela ne se limite pas à la fonctionnalité de transaction - une erreur similaire est générée si AOP est également manquant:

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

Les fichiers JAR désormais requis sont:spring-aop (et implicitementaopalliance):


    org.springframework
    spring-aop
    4.1.0.RELEASE

6. Conclusion

À la fin de cet article, nous devrions avoir une carte claire pour parcourir la variété des causes et des problèmes qui peuvent conduire à unBean Definition Store Exception ainsi qu'une bonne compréhension de la façon de résoudre tous ces problèmes.

L'implémentation de certains de ces exemples d'exceptions peut être trouvée dansthe github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.