Java Spring AbstractAnnotationConfigDispatchersServletInitializer未找到WebApplicationContext:未注册ContextLoaderListener
我使用的是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代码: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
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;
}