相关疑难解决方法(0)

为什么DispatcherServlet会创建另一个应用程序上下文?

我已使用ContextLoaderListener和上下文init-parameter 配置了根应用程序上下文contextConfigLocation.

然后由JSF(*.jsf)变量解析器访问根上下文.它工作正常.

现在的问题是,通过的请求(*.do)DispatcherServlet将获得另一个应用程序上下文,然后单例bean被实例化两次.

我不需要另一个应用程序上下文DispatcherServlet,我如何指定它来重用现有的根应用程序上下文ContextLoaderListener

注意

在阅读了答案中的参考页面后,我知道根上下文和调度程序上下文之间存在上下文分离,但没有一个引用告诉我去哪里.所以这是我的解决方案,可能对面临类似问题的其他人有帮助:

  1. 在调度程序servlet的上下文配置XML中:dispatcher-servlet.xml,我<context:component-scan/>已经定义了重复,这已经在根上下文中定义.所以删除它.该dispatcher-servlet.xml只需要定义仅用于Spring MVC的那些豆子.

  2. 所有控制器都已在根上下文中进行扫描和实例化,但是,默认情况下,Spring MVC不会在根上下文中注册控制器以进行请求映射.你可以:

    2.1.在根上下文中,@Controller从dispatcher-servlet.xml中排除<component-scan>,@Controller仅扫描.

    2.2.或者,将属性设置DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts为true:

    (dispatcher-servlet.xml:)
    
    <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="detectHandlersInAncestorContexts" value="true" />
    </bean>
    
    Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc

25
推荐指数
1
解决办法
2万
查看次数

在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>
Run Code Online (Sandbox Code Playgroud)

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

干杯

java spring

7
推荐指数
1
解决办法
7576
查看次数

标签 统计

java ×2

spring ×2

spring-mvc ×1