web-dev-qa-db-ja.com

web.xmlでapplicationContext.xmlファイルの代わりにSpring @Configurationアノテーション付きクラスを登録するにはどうすればよいですか?

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.xmlcontextConfigLocation paramを明示的に指定しないと、applicationContext.xmlという名前のデフォルトのスプリングコンテキストファイルがweb.xmlで検索されます。さて、Springコンテキストファイルを使用したくない場合はどうすればよいですか?注釈付きのすべての設定を行いますか?リスナーファイルContextLoaderListenerを登録する方法

67
Mital Pritmani

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>
132
tolitius

ここで古い質問を盛り上げますが、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"};
    }
}
11
Angad