无法从子WebApplicationContext访问在根ApplicationContext中配置的Spring拦截器

时间:2014-10-10 19:10:10

标签: java spring spring-mvc interceptor applicationcontext

好的,我理解通过DispatcherServlet配置的任何Web应用程序上下文都继承了根WebApplicationContext中已定义的所有bean。不过我在我的根ApplicationContext

中配置了一些拦截器
     <bean   class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
                <property name="order" value="2"/>
                <property name="interceptors">
                    <list>
                        <ref bean="statisticsInterceptor"/>
                        <ref bean="sessionDiagnosticsInterceptor"/>
...

然后在我的web.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>

所以问题是我每次去任何包含&#34; / example / apiOther / &#34;的网址时,都不会到达/运行拦截器。我的问题是:为什么? handlerMapping的范围是什么?我认为,因为它在根applicationContext中,它应该适用于所有子上下文。我一直在做一些研究,我认为HandlerMappings仅限于其上下文,即使它是根上下文。是吗?

1 个答案:

答案 0 :(得分:0)

在通过DefaultAnnotationHandlerMapping配置拦截器时,它们将仅用于同一ApplicationContext中的控制器。您可以(即使它不是很好)在根应用程序上下文中声明拦截器,前提是引用它们的DefaultAnnotationHandlerMapping在servlet应用程序上下文中声明,您可以直接或通过注释声明控制器。