在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沟通。