Webアプリケーションでjsfとspringを一緒に使用しています。 @Configuration, @ComponentScan
などの注釈を使用する1つの構成クラスでデータソースとセッションファクトリを構成しました。プロジェクトにapplicationContext.xmlファイルがありません構成クラスのコンテキストxml。テストケースは正常に機能しますが、Webアプリケーションをデプロイするとエラーが発生します
Java.lang.IllegalStateException:WebApplicationContextが見つかりません:ContextLoaderListenerが登録されていませんか?
Web.xmlでリスナークラスを指定すると、
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
それは私にエラーを与えます、
/WEB-INF/applicationContext.xmlが見つかりません
ContextLoaderListener
のドキュメントによると、web.xml
でcontextConfigLocation
paramを明示的に指定しないと、applicationContext.xml
という名前のデフォルトのスプリングコンテキストファイルがweb.xml
で検索されます。さて、Springコンテキストファイルを使用したくない場合はどうすればよいですか?注釈付きのすべての設定を行いますか?リスナーファイルContextLoaderListener
を登録する方法
web.xml
では、bootstrap AnnotationConfigWebApplicationContext
を含むコンテキスト:
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
org.package.YouConfigurationAnnotatedClass
</param-value>
</init-param>
</servlet>
また、MVCアノテーションに使用する@EnableWebMvc
を使用することを忘れないでください。
さらに読む:
はい、もちろんリスナーが必要です。上記は「web.xmlでapplicationContext.xmlファイルの代わりにSpring @Configuration注釈付きクラスを登録する方法」という質問に完全に答えますが、ここに- 例 完全なweb.xml
をレイアウトするSpring公式ドキュメントから:
<web-app>
<!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<!-- Configuration locations must consist of one or more comma- or space-delimited
fully-qualified @Configuration classes. Fully-qualified packages may also be
specified for component-scanning -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.acme.AppConfig</param-value>
</context-param>
<!-- Bootstrap the root application context as usual using ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Declare a Spring MVC DispatcherServlet as usual -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<!-- Again, config locations must consist of one or more comma- or space-delimited
and fully-qualified @Configuration classes -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.acme.web.MvcConfig</param-value>
</init-param>
</servlet>
<!-- map all requests for /app/* to the dispatcher servlet -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
ここで古い質問を盛り上げますが、Servlet 3.0+をサポートするWebコンテナーにアプリをデプロイする場合は、Springの最新バージョン(v3.0 +)でweb.xmlを完全に削除できます。
Springの WebApplicationInitializer
インターフェイスを実装して、web.xmlで行うのと同じ設定を行うことができます。この実装クラスは、Servlet 3.0+コンテナで実行されているSpring 3.0+アプリによって自動的に検出されます。
セットアップがかなり単純な場合、代わりに、以下に示すように、Springが提供する別のクラスを使用できます。ここでは、@ Configurationクラスを設定し、サーブレットマッピングをリストします。セットアップを非常にシンプルに保ちます。
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {AppConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {
"*.html"
,"*.json"
,"*.do"};
}
}