Spring BeanDefinitionStoreException
1. 概要
この記事では、Springorg.springframework.beans.factory.BeanDefinitionStoreExceptionについて説明します。これは通常、Bean定義が無効であり、そのBeanのロードに問題がある場合のBeanFactoryの責任です。 この記事では、この例外の最も一般的な原因とその解決策について説明します。
2. 原因:java.io.FileNotFoundException
BeanDefinitionStoreExceptionが基になるIOExceptionによって引き起こされる可能性がある原因は、複数考えられます。
2.1. IOException ServletContextリソースからXML文書を解析する
これは通常、Spring WebアプリケーションでSpring MVCのweb.xmlにDispatcherServletが設定されている場合に発生します。
mvc
org.springframework.web.servlet.DispatcherServlet
デフォルトでは、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]
もちろん、solutionは、mvc-servlet.xmlファイルが実際に/WEB-INFの下に存在することを確認するためのものです。そうでない場合は、サンプルを作成できます。
2.2. IOExceptionクラスパスリソースからのXMLドキュメントの解析
これは通常、アプリケーション内の何かが存在しないXMLリソースを指している場合、または本来あるべき場所に配置されていない場合に発生します。
このようなリソースを指すことは、さまざまな方法で行われます。
たとえばJava構成を使用すると、これは次のようになります。
@Configuration
@ImportResource("beans.xml")
public class SpringConfig {...}
XMLでは、これは次のようになります。
または、Spring XMLコンテキストを手動で作成することでも:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ファイルが存在しない場合、これらすべてで同じ例外が発生します。
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]
solutionはファイルを作成し、プロジェクトの/src/main/resourcesディレクトリの下に配置します。このようにして、ファイルはクラスパスに存在し、Springによって検出されて使用されます。
3. 原因:Could Not Resolve Placeholder …
このエラーは、Springがプロパティを解決しようとしたが、解決できない場合に発生します。考えられる多くの理由の1つです。
ただし、最初に、プロパティの使用方法-これはXMLで使用できます。
... value="${some.property}" ...
このプロパティはJavaコードでも使用できます。
@Value("${some.property}")
private String someProperty;
最初に確認することは、プロパティの名前が実際にプロパティ定義と一致することです。この例では、次のプロパティを定義する必要があります。
some.property=someValue
次に、プロパティファイルがSpringのどこで定義されているかを確認する必要があります。これについては、私のProperties with Spring Tutorialで詳しく説明しています。 従うべき良いベストプラクティスは、アプリケーションの/src/main/resourcesディレクトリの下にすべてのプロパティファイルを置き、それらを次の方法でロードすることです。
"classpath:app.properties"
明らかなことから先に進む– Springがプロパティを解決できないもう1つの考えられる原因は、Springコンテキストにmultiple PropertyPlaceholderConfigurer beans(または複数のproperty-placeholder要素)が存在する可能性があることです。
その場合、solutionは、これらを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がある場合に発生します。 older version of Spring accidentally on the project classpathを使用することは、想像以上に一般的です。問題とその解決策をSpring Security with Maven articleで説明しました。
要するに、このエラーの解決策は簡単です。クラスパス上のすべての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構成でトランザクション機能が構成されている場合に発生します。
NoClassDefFoundErrorは、Spring Transactionalサポート(つまり、spring-tx)がクラスパスに存在しないことを意味します。
解決策は簡単です–spring-txはMavenpomで定義する必要があります。
org.springframework
spring-tx
4.1.0.RELEASE
もちろん、これはトランザクション機能に限定されるものではありません。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):
org.springframework
spring-aop
4.1.0.RELEASE
6. 結論
この記事の最後に、Bean Definition Store Exceptionにつながる可能性のあるさまざまな原因と問題をナビゲートするための明確なマップと、これらすべての問題を修正する方法を十分に把握する必要があります。
これらの例外の例のいくつかの実装は、the github projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。