1

XML 構成なしで Spring 3.2.5 を使用しています。AbstractAnnotationConfigDispatcherServletInitializer を使用してアプリケーションを初期化し、AbstractSecurityWebApplicationInitializer を使用して春のセキュリティを初期化しています。

私のアプリケーションは、Spring Tool Suite に同梱されている VMware vFabric tc Server Developer Edition v2.9 を使用してファイルをデプロイおよび実行します。ただし、jdk 1.7.0_21 を JR として使用して、標準の Tomcat 7.0.12 にデプロイすると、

HTTP ステータス 500 -

タイプ例外レポート

メッセージ

サーバーで内部エラー () が発生したため、この要求を実行できませんでした。

例外

java.lang.IllegalStateException: WebApplicationContext が見つかりません: ContextLoaderListener が登録されていませんか?
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:251)
note 根本原因の完全なスタック トレースは、Apache Tomcat/7.0.12 ログで入手できます。

アパッチ トムキャット/7.0.12

スタックトレースは次のとおりです。

SEVERE: Servlet.service() for servlet [default] in context with path [/auctionmanagerMVC] threw exception
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:251)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

ここに私の AbstractAnnotationConfigDispatcherServletInitializer コードがあります:

public class CrmWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {

    return new Class<?>[]{ServiceConfiguration.class,SecurityConfig.class,SocialContext.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {

    return new Class<?>[]{RestMvcConfiguration.class, WebMvcConfiguration.class};
}

@Override
protected String[] getServletMappings() {
    return new String[]{"/"};
}

@Override
protected Filter[] getServletFilters() {
    return new Filter[]{new HiddenHttpMethodFilter(), new MultipartFilter(), new OpenEntityManagerInViewFilter()};
}
@Override
protected void registerDispatcherServlet(ServletContext servletContext) {
    super.registerDispatcherServlet(servletContext);

    servletContext.addListener(new HttpSessionEventPublisher());

}
@Override
protected WebApplicationContext createRootApplicationContext() {
    AnnotationConfigWebApplicationContext appContext = (AnnotationConfigWebApplicationContext)super.createRootApplicationContext();

    String profile;
     profile = "brett";

     appContext.getEnvironment().setActiveProfiles(profile);
     return appContext;
}

}
@Configuration
@ComponentScan(basePackages={"com.auctionmanagermvc","com.hodeltech"})
@EnableWebMvc
@EnableHypermediaSupport
class RestMvcConfiguration extends RepositoryRestMvcConfiguration {
}

このアプリケーションを Tomcat で起動する方法について教えていただけると助かります。この問題により、Heroku や Amazon Elastic Beanstalk などのクラウド ベンダーにうまくデプロイできません。

事前にどうもありがとうございました!

編集: AbstractSecurityWebApplicationInitializer の追加

public class CrmSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    /**
     * Instruct Spring Security to use the {@link DispatcherServlet}'s
     * {@link WebApplicationContext} to find the springSecurityFilterChain.
     */
    @Override
    protected String getDispatcherWebApplicationContextSuffix() {
        return AbstractDispatcherServletInitializer.DEFAULT_SERVLET_NAME;
    }

    /**
     * Insert the following filters before Spring Security. Be careful when inserting
     * filters before Spring Security!
     */
    @Override
    protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
    //      insertFilters(servletContext, new HiddenHttpMethodFilter(), new MultipartFilter() , new OpenEntityManagerInViewFilter());
    }

    /**
     * Register the {@link HttpSessionEventPublisher}
     */
    @Override
    protected boolean enableHttpSessionEventPublisher() {
        return true;
    }

}

EDIT:私が気付いたもう1つのこと:vFabricサーバーを使用して起動すると、Springがすべてのクラスを2回スキャンしたように見えました。たとえば、構成メソッドにログ ステートメントを配置すると、出力が 2 回取得されます。Tomcat で実行すると、ログ ステートメントが 1 回しか表示されません。それがこの問題と関係があるかどうかはわかりませんが、私が気づいた興味深い違いです。

4

3 に答える 3

0

そのため、さらに試行錯誤を重ねた結果、Tomcat と VMware vFabric tc Server Developer Edition v2.9 の違いの原因を突き止めました。vFabric は Tomcat 7.0.47 を使用しており、私が使用していた Tomcat のバージョンは 7.0.22 でした。また、Amazon Elastic Beanstalk で 7.0.40 を実行してみましたが、これにも問題がありました。しかし、Tomcat 7.0.47 にアップグレードすると、すべてうまくいきました。

この問題を調べてくれたすべての人に感謝します。

于 2013-12-18T01:17:37.920 に答える