67

Web アプリケーションで jsf と spring を一緒に使用しています。@Configuration, @ComponentScanなどの注釈を使用する1つの構成クラスでデータソースとセッションファクトリを構成しました。構成クラスでコンテキストxmlのすべてのエントリを処理しているため、プロジェクトにapplicationContext.xmlファイルがありません。テスト ケースは正常に動作しますが、Web アプリケーションをデプロイするとエラーが発生します

java.lang.IllegalStateException: WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか?

web.xml でリスナークラスを指定すると、

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

それは私にエラーを与えます、

/WEB-INF/applicationContext.xml が見つかりません

のドキュメントによると、 param in を明示的に指定ContextLoaderListenerしないと、 in という名前のデフォルトのスプリング コンテキスト ファイルが検索されるのは事実です。さて、Spring コンテキスト ファイルを使用せず、すべての構成を注釈で行いたくない場合はどうすればよいですか? xml ファイルを使用せずにアノテーションのみを使用して、Spring と jsf で Web アプリケーションを実行できるようにするには、リスナー クラスをどのように登録すればよいですか?contextConfigLocationweb.xmlapplicationContext.xmlweb.xmlContextLoaderListener

4

2 に答える 2

132

web.xmlコンテキストをブートストラップする必要があります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>

@EnableWebMvcまた、MVC アノテーションを有効にするためにを使用することを忘れないでください。

参考文献:

「コメントフォローアップ」として編集=>チューリング完全になる:

はい、もちろんリスナーが必要です。上記は「web.xml の applicationContext.xml ファイルの代わりに Spring @Configuration アノテーション付きクラスを登録する方法」という質問に完全に答えていますが、完全な.xmlをレイアウトする Spring 公式ドキュメントのweb.xmlを次に示します。

<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>
于 2011-11-10T07:11:00.207 に答える
10

ここで古い質問をぶつけますが、Spring の最近のバージョン (v3.0+) では、サーブレット 3.0+ をサポートする Web コンテナーにアプリをデプロイしている場合、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"};
    }
}
于 2014-09-22T16:30:11.877 に答える