在Spring 3上通过ContextLoaderListener而不是DispatcherServlet进行DefaultAnnotationHandlerMapping

时间:2009-09-23 09:13:43

标签: java spring

当我使用 DispatcherServlet 时,我得到一个 java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener? 使用 DelegatingFilterProxy 过滤器时出错。因此我删除了 DispatcherServlet ,现在我改为使用 ContextLoaderListener ,我的Spring应用程序加载正常。但是,我有一个非常重要的bean的问题:

   <context:component-scan base-package="com.mydomain"/>  
   <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
      <property name="interceptors">
         <list>
            <ref bean="openSessionInViewInterceptor" />
         </list>
      </property>
   </bean>

这个bean不再有效,我的@Controller都不再是URL映射了。如果我切换回使用 DispatcherServlet ,没问题(除了我的过滤器再次没用)。如何从 ContextLoaderListener 中正确加载此bean?

干杯

的Nik

2 个答案:

答案 0 :(得分:22)

您需要ContextLoaderListener DispatcherServlet - 错误消息没有告诉您删除servlet。

为了阐明Spring在这里做了什么,DispatcherServlet创建了自己的ApplicationContext(通常使用xxx-servlet.xml),但是您在web.xml中配置的任何Spring Filter都没有访问servlet的ApplicationContext

ContextLoaderListener创建第二个ApplicationContext(与整个webapp相关联),并将自身与servlet的ApplicationContext链接,允许过滤器和servlet通过Spring进行通信。

答案 1 :(得分:1)

Spring MVC基本应用程序的web.xml虽然没有ContextLoaderListener?请参阅https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/src/main/webapp/WEB-INF/web.xml

我问的原因是因为我的申请中出现以下错误:

错误[[Spring MVC Dispatcher Servlet]] servlet的Servlet.service()Spring MVC Dispatcher Servlet抛出异常 java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener?

我没有ContextLoaderListener(可能导致问题)。

关于为什么MVC基本应用程序会起作用的任何想法?