Spring BeanDefinitionStoreException

Spring BeanDefinitionStoreException

1. Visão geral

Neste artigo, discutiremos o Springorg.springframework.beans.factory.BeanDefinitionStoreException - isso normalmente é responsabilidade de umBeanFactory quando uma definição de bean é inválida, o carregamento desse bean é problemático. O artigo discutirá as causas mais comuns dessa exceção, juntamente com a solução para cada uma.

2. Causa:java.io.FileNotFoundException

Existem várias causas possíveis para queBeanDefinitionStoreException possa ser causado por umIOException subjacente:

2.1. IOException Analisando documento XML do recurso ServletContext

Isso geralmente acontece em um aplicativo Spring Web, quando umDispatcherServlet é configurado emweb.xml para Spring MVC:


   mvc
   org.springframework.web.servlet.DispatcherServlet

Por padrão, o Spring irá procurar por um arquivo chamado exatamentespringMvcServlet-servlet.xml no diretório/WEB-INF do aplicativo da web.

Se este arquivo não existir, a seguinte exceção será lançada:

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]

Osolution é claro para certificar-se de que o arquivomvc-servlet.xml realmente existe em/WEB-INF; se não, então uma amostra pode ser criada:




2.2. IOException Analisando documento XML do recurso de caminho de classe

Isso geralmente acontece quando algo no aplicativo aponta para um recurso XML que não existe ou não foi colocado onde deveria estar.

Apontar para esse recurso pode acontecer de várias maneiras.

Usando, por exemplo, a Configuração Java, isso pode se parecer com:

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

Em XML, será:

Ou até criando um contexto XML da Spring manualmente:

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

Tudo isso levará à mesma exceção se o arquivo não existir:

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]

Osolution é criar o arquivo e colocá-lo no diretório/src/main/resources do projeto - desta forma, o arquivo existirá no classpath e será encontrado e usado pelo Spring.

3. Causa:Could Not Resolve Placeholder …

Este erro ocorre quando o Spring tenta resolver uma propriedade, mas não consegue - por um dos muitos motivos possíveis.

Mas primeiro, o uso da propriedade - isso pode ser usado em XML:

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

A propriedade também pode ser usada no código Java:

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

A primeira coisa a verificar é que o nome da propriedade realmente corresponde à definição da propriedade; neste exemplo, precisamos ter a seguinte propriedade definida:

some.property=someValue

Em seguida, precisamos verificar onde o arquivo de propriedades está definido no Spring - isso é descrito em detalhes em meuProperties with Spring Tutorial. Uma boa prática recomendada a seguir é ter todos os arquivos de propriedades no diretório/src/main/resources do aplicativo e carregá-los via:

"classpath:app.properties"

Continuando do óbvio - outra possível causa que o Spring não é capaz de resolver a propriedade é que pode havermultiple PropertyPlaceholderConfigurer beans no contexto do Spring (ou vários elementosproperty-placeholder)

Se for esse o caso, osolution está colapsando-os em um único ou configurando aquele no contexto pai comignoreUnresolvablePlaceholders.

4. Causa:java.lang.NoSuchMethodError

Este erro ocorre em várias formas - uma das mais comuns é:

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;

Isso geralmente acontece quando há várias versões do Spring no caminho de classe. Ter umolder version of Spring accidentally on the project classpath é mais comum do que se poderia pensar - descrevi o problema e a solução para isso emSpring Security with Maven article.

Em resumo, a solução para esse erro é simples - verifique todos os jars do Spring no caminho de classe e verifique se todos têm a mesma versão - e se a versão é 3.0 ou superior.

Da mesma forma, a exceção não se restringe ao beanMutablePropertyValues - existem várias outras encarnações do mesmo problema, causadas pela mesma inconsistência de versão:

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

Um problema comum, similarmente relacionado ao Maven e às dependências existentes do Spring, é:

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

Isso ocorre quando a funcionalidade transacional é configurada na configuração XML:

ONoClassDefFoundError significa que o suporte Transacional Spring - a saberspring-tx - não existe no caminho de classe.

A solução é simples -spring-tx precisa ser definido no pom Maven:


    org.springframework
    spring-tx
    4.1.0.RELEASE

Obviamente, isso não se limita à funcionalidade da transação - um erro semelhante será gerado se o AOP também estiver ausente:

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

Os jars que agora são necessários são:spring-aop (e implicitamenteaopalliance):


    org.springframework
    spring-aop
    4.1.0.RELEASE

6. Conclusão

No final deste artigo, devemos ter um mapa claro para navegar pela variedade de causas e problemas que podem levar a umBean Definition Store Exception, bem como uma boa noção de como consertar todos esses problemas.

A implementação de alguns desses exemplos de exceções pode ser encontrada emthe github project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.