无法从子WebApplicationContext访问根ApplicationContext中配置的java Spring拦截器
好的,我知道通过DispatcherServlet配置的任何web应用程序上下文都会继承根WebApplicationContext中已经定义的所有bean。尽管如此,我还是在根应用程序上下文中配置了一些拦截器
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="2"/>
<property name="interceptors">
<list>
<ref bean="statisticsInterceptor"/>
<ref bean="sessionDiagnosticsInterceptor"/>
...
然后在我的网上。xml我有这样的东西:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext*.xml
</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dispatcher-api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/appOtherContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher-api</servlet-name>
<url-pattern>/example/apiOther/*</url-pattern>
</servlet-mapping>
所以我遇到的问题是,每次我访问任何包含“/example/apiOther/”的URL时,都无法访问/运行拦截器。我的问题是:为什么handlerMapping的范围是什么?我认为,因为它位于根applicationContext中,所以应该应用于所有子上下文。我一直在做一些研究,我认为HandlerMapping仅限于其上下文,即使它是根上下文。是这样吗
# 1 楼答案
当您通过
DefaultAnnotationHandlerMapping
配置拦截器时,它们将仅用于同一ApplicationContext中的控制器。您可以(即使不是很好)在根应用程序上下文中声明拦截器,前提是引用它们的DefaultAnnotationHandlerMapping
在servlet应用程序上下文中声明,您可以直接或通过注释声明控制器