[Spring Exception] Spring BeanDefinitionStoreException
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>