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


问题内容

使用 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 ?

干杯

尼克


问题答案:

同时需要ContextLoaderListener DispatcherServlet-错误消息没有告诉你删除的servlet。

为了弄清楚Spring在这里做什么,DispatcherServlet创建了自己的ApplicationContext(通常使用xxx- servlet.xml),但是您在web.xml中配置的任何Spring过滤器都无法访问Servlet的ApplicationContext

ContextLoaderListener创建第二个ApplicationContext与servlet的(与整个Web应用程序相关联),并链接本身ApplicationContext,使过滤器和servlet来通过Spring沟通。