Web/spring

[Spring Exception] Spring BeanDefinitionStoreException

태애니 2023. 4. 8. 14:52
728x90

https://www.baeldung.com/spring-beandefinitionstoreexception

 

 


 

 

 

 Spring 

org.springframework.beans.factory.BeanDefinitionStoreException

일반적으로 bean 정의가 유효하지 않을 때 BeanFactory 의 책임이며 해당 bean의 로딩에 문제가 있는 경우

 

 


Cause: java.io.FileNotFoundException

 

BeanDefinitionStoreException 이 기본 IOException 에 의해 발생할 수 있다.

IOException Parsing XML Document From ServletContext Resource

DispatcherServlet 이 Spring MVC용 web.xml 에 설정될 때 Spring 웹 애플리케이션에서 발생

 

<servlet>  
   <servlet-name>mvc</servlet-name>  
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
</servlet>

 

 

Spring은 웹 애플리케이션의 /WEB-INF 디렉토리 에서 정확히 springMvcServlet-servlet.xml 이라는 파일을 찾는데

이 파일이 없으면 예외가 발생한다

 

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]

 

해결을 위해서는 mvc-servlet.xml 파일이 실제로 /WEB-INF 아래에 있는지 확인하거나 없다면 만들면 된다

<?xml version="1.0" encoding="UTF-8"?>
<beans 
   xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" >

</beans>

 

 

 

 

IOException Parsing XML Document From Class Path Resource

This usually happens when something in the application points to an XML resource that doesn't exist, or is not placed where it should be.

존재하지말아야하거나 있어야하는데 배치되지 않은 XML 리소스를 가져오려고 할때 발생

 

 

이런 식으로 표시했을 경우에

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

 

 

 

파일이 존재하지 않는 경우 동일한 예외가 나타난다.

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]

 

해결하려면 파일을 생성하고 프로젝트의 /src/main/resources 디렉토리 아래에 배치한다

그러면 알아서 파일이 클래스 경로를 타고 Spring에서 찾아서 사용한다.

 

 

 


Cause: Could Not Resolve Placeholder … 

 Spring이 속성을 해결하려고 시도하지만 많은 가능한 이유 중 하나로 인해 해결하지 못할 때 발생한다.

 

Java 코드 예시

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

 

 

에러가 날 경우 확인해봐야할 것들

먼저 확인해야 할 것은 속성 이름이 실제로 속성 정의와 일치하는지 확인한다

some.property=someValue

https://www.baeldung.com/properties-with-spring

 

모든 속성 파일을 애플리케이션의 /src/main/resources 디렉토리 아래에 두고 다음을 통해 로드한다.

"classpath:app.properties"

 

다른 원인은 Spring 컨텍스트(또는 여러 속성-플레이스홀더 요소) 에 여러 PropertyPlaceholderConfigurer 빈이 있을 때이다

해결책은 이들을 하나로 축소하거나 ignoreUnresolvablePlaceholders 를 사용하여 상위 컨텍스트에서 구성한다

 

 

 

Cause: java.lang.NoSuchMethodError 

 

 

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;

이것은 일반적으로 클래스 경로에 여러 버전의 Spring이 있을 때 발생한다. 

실수로 이전 버전의 Spring이 프로젝트 클래스 경로에 있는 경우가 일반적이다. 

 

클래스 경로의 모든 Spring jar를 확인하고 모두 동일한 버전인지 확인하고 해당 버전이 3.0 이상인지 확인해야한다

 

 

유사하게, 예외는 MutablePropertyValues ​​빈으로 제한되지 않는다.

동일한 버전 불일치로 인해 발생하는 동일한 문제의 다른 여러 구현이 있다.

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

 

 

 

Cause: java.lang.NoClassDefFoundError 

Maven 및 기존 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

이는 XML 구성에서 트랜잭션 기능이 구성된 경우에 발생한다

<tx:annotation-driven/>

 

 

NoClassDefFoundError는 Spring 트랜잭션 지원(즉, spring-tx )이 클래스 경로에 존재하지 않음을 의미합니다.

해결책은 간단합니다. spring-tx는 Maven pom에서 정의되어야 합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.1.0.RELEASE</version>
</dependency>복사

물론 이것은 트랜잭션 기능에만 국한되지 않습니다. AOP가 누락된 경우에도 유사한 오류가 발생한다.

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

 

 필요한 jar를 추가하면 해결된다

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.1.0.RELEASE</version>
</dependency>
728x90