1概要
この記事では、Spring
org.springframework.beans.factory.BeanDefinitionStoreException
について説明します。これは通常、Bean定義が無効な場合の
BeanFactory
の責任です。そのBeanのロードは問題があります。この記事では、この例外の最も一般的な原因とそれぞれの解決策について説明します。
2原因:
java.io.FileNotFoundException
BeanDefinitionStoreException
が原因となっている
IOException
によって引き起こされる可能性がある複数の考えられる原因があります。
2.1. ServletContextリソースからの
IOException
XML文書の解析
これは通常、Spring Webアプリケーションで
DispatcherServlet
がSpring MVCの
web.xml
に設定されている場合に発生します。
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
デフォルトでは、SpringはWebアプリケーションの
/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__の下に存在することを確認するためのものです。そうでない場合は、サンプルを作成できます。
[source,xml,gutter:,true]
<?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>
==== ** 2.2. __IOException__クラスパスリソースからのXML文書の解析** これは通常、アプリケーション内の何かが、存在しない、または本来あるべき場所に配置されていないXMLリソースを指しているときに発生します。 そのようなリソースを指すことは、さまざまな方法で起こります。 たとえばJava Configurationを使用すると、これは次のようになります。 [source,java,gutter:,true]
@Configuration
@ImportResource(“beans.xml”)
public class SpringConfig {…}
XMLでは、これは次のようになります。 [source,xml,gutter:,true]
<import resource=”beans.xml”/>
あるいは手動でSpring XMLコンテキストを作成することによっても: [source,java,gutter:,true]
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
ファイルが存在しない場合、これらすべてが同じ例外になります。 [source,bash,gutter:,true]
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によって検出され使用されます。
** 3原因:
プレースホルダを解決できませんでした…
**
このエラーは、Springがプロパティを解決しようとしたが解決できなかった場合に発生します – 考えられる理由の1つ。
しかし、最初に、プロパティの使い方 – これはXMLで使われるかもしれません:
... value="${some.property}" ...
このプロパティは、Javaコードでも使用できます。
@Value("${some.property}")
private String someProperty;
最初に確認することは、プロパティの名前が実際にはプロパティ定義と一致することです。この例では、次のプロパティを定義する必要があります。
some.property=someValue
それから、Springのどこでプロパティファイルが定義されているかをチェックする必要があります – これは私のリンクで詳しく説明されています:/properties-with-spring[Properties with Spring Tutorial]。従うべきベストプラクティスは、すべてのプロパティファイルをアプリケーションの
/src/main/resources
ディレクトリの下に置き、それらを次の方法でロードすることです。
"classpath:app.properties"
自明なところから先に進むと、Springがプロパティを解決できないもう1つの考えられる原因は、Springコンテキスト内に
multiple
PropertyPlaceholderConfigurer
beans
(または複数の
property-placeholder
要素)が存在する可能性があることです。
その場合、
解決策
はこれらを1つにまとめるか、または
ignoreUnresolvablePlaceholders
を使用して親コンテキスト内のものを構成します。
** 4原因:
java.lang.NoSuchMethodError
**
このエラーにはさまざまな形があります。最も一般的なエラーの1つは、次のとおりです。
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-security-with-maven#maven__problem]。
手短に言えば、このエラーの解決策は簡単です – クラスパス上のすべてのSpring jarファイルをチェックし、それらすべてが同じバージョンを持っていることを確認してください – そしてそのバージョンは3.0以上です。
同様に、例外は
MutablePropertyValues
Beanに制限されていません – 同じバージョンの不一致によって引き起こされる同じ問題の他の具体化がいくつかあります。
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原因:
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 Transactionalサポート(つまり
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は、
spring-aop
(そして暗黙のうちに
aopalliance
)です。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
6. 結論
この記事の最後には、
Bean Definition Store Exception
につながる可能性のあるさまざまな原因と問題をナビゲートするための明確なマップがあります。また、これらすべての問題を解決する方法についてもよく理解しておく必要があります。
これらの例外の例のいくつかの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-exceptions/src/main/java/org/baeldung/ex/beandefinitionstoreexception[githubプロジェクト]にあります。 – これはEclipseベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。