Java Spring AbstractAnnotationConfigDispatchersServletInitializer未找到WebApplicationContext:未注册ContextLoaderListener

Java Spring AbstractAnnotationConfigDispatchersServletInitializer未找到WebApplicationContext:未注册ContextLoaderListener,java,spring,tomcat7,startup,spring-java-config,Java,Spring,Tomcat7,Startup,Spring Java Config,我使用的是Spring3.2.5,没有XML配置。我使用AbstractAnnotationConfigDispatchersServletInitializer初始化应用程序,使用AbstractSecurityWebApplicationInitializer初始化spring安全性 我的应用程序使用Spring工具套件附带的VMware vFabric tc Server Developer Edition v2.9部署和运行文件。但是,当我使用JDK1.7.0_21作为JR部署到标准To

我使用的是Spring3.2.5,没有XML配置。我使用AbstractAnnotationConfigDispatchersServletInitializer初始化应用程序,使用AbstractSecurityWebApplicationInitializer初始化spring安全性

我的应用程序使用Spring工具套件附带的VMware vFabric tc Server Developer Edition v2.9部署和运行文件。但是,当我使用JDK1.7.0_21作为JR部署到标准Tomcat 7.0.12时

HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered? org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:251) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs. Apache Tomcat/7.0.12 以下是我的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 {
}
编辑:我注意到另外一件事:
当使用vFabric服务器启动时,spring似乎对所有类进行了两次扫描。例如,我在配置方法中放入一条日志语句,它将获得两次输出。在Tomcat下运行时,我只看到一次日志记录语句。我不知道这是否与此问题有关,但我注意到了一个有趣的差异。

因此,经过更多的尝试和错误,我终于发现了导致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后,一切正常


感谢所有关注此问题的人。

经过更多的尝试和错误,我终于发现了导致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后,一切正常


感谢所有关注这个问题的人。

看起来您解决了这个问题,但是,我也经历了同样的情况,解决方案略有不同。对我有效的解决方案是将
WebConfig.class
(我的配置类包含
@EnableWebMvc
注释)添加到
getRootConfigClasses()
方法。这使Spring Security能够获得
WebApplicationContext

看起来您解决了这个问题,但是,我也遇到了同样的问题,解决方案略有不同。对我有效的解决方案是将
WebConfig.class
(我的配置类包含
@EnableWebMvc
注释)添加到
getRootConfigClasses()
方法。这使Spring Security能够获得
WebApplicationContext

我收到了相同的错误,在我的情况下,解决方案也不同。 我没有重写AbstractSecurityWebApplicationInitializer的getDispatcherWebApplicationContextSuffix方法

从您的问题中添加实现后,所有这些都开始工作:

@Override
protected String getDispatcherWebApplicationContextSuffix() {
    return AbstractDispatcherServletInitializer.DEFAULT_SERVLET_NAME;
}

我得到了同样的错误,在我的情况下,解决方案也不同。 我没有重写AbstractSecurityWebApplicationInitializer的getDispatcherWebApplicationContextSuffix方法

从您的问题中添加实现后,所有这些都开始工作:

@Override
protected String getDispatcherWebApplicationContextSuffix() {
    return AbstractDispatcherServletInitializer.DEFAULT_SERVLET_NAME;
}

您是否在servlet config/web.xml中配置了ContextLoaderListener?没有。我的印象是,使用AbstractAnnotationConfigDispatcherServletInitializer和重写的createRootApplicationContext方法取代了对web.xml的需要。据我所知,被重写的createRootApplicationContext方法负责添加ContextLoaderListener。但是,如果你重写它,那将如何添加任何内容呢?我相信这是因为我在被重写方法的主体内调用super。Derp,我错过了这一点,抱歉。您是否在servlet config/web.xml中配置了ContextLoaderListener?没有。我的印象是,使用AbstractAnnotationConfigDispatcherServletInitializer和重写的createRootApplicationContext方法取代了对web.xml的需要。据我所知,被重写的createRootApplicationContext方法处理添加ContextLoaderListener的问题。但是如果你重写它,那将如何添加任何内容呢?我相信这是因为我在被重写的方法体内调用super。Derp,我错过了,抱歉。
@Override
protected String getDispatcherWebApplicationContextSuffix() {
    return AbstractDispatcherServletInitializer.DEFAULT_SERVLET_NAME;
}