Я сконфигурировал контекст корневого приложения, используя ContextLoaderListener
и контекстный параметр init contextConfigLocation
.
Затем к корневому контексту обращается переменная-преобразователь JSF (* .jsf).Это работает нормально.
Теперь проблема в том, что запросы (* .do), проходящие через DispatcherServlet
, получат другой контекст приложения, и затем синглтон-бины будут созданы дважды.
Я не знаюДля DispatcherServlet
нужен другой контекст приложения, как я могу указать его для повторного использования существующего корневого контекста приложения, который загружается ContextLoaderListener
?
NOTE
После прочтения справочных страниц в ответах я знаю, что между корневым контекстом и контекстом диспетчера существует разделение контекста, но ни одна из ссылок не говорит мне, куда идти.Итак, вот мое решение, может быть полезным для других людей, сталкивающихся с подобным вопросом:
В XML-файле конфигурации контекста для сервлета диспетчера: dispatcher-servlet.xml
, я продублировал определение <context:component-scan/>
, котороеуже определен в корневом контексте.Так что убери это.dispatcher-servlet.xml
должен определять только те компоненты, которые используются только для Spring MVC.
Все контроллеры уже отсканированы и созданы в корневом контексте, однако Spring MVC по умолчанию не 'зарегистрировать контроллеры в корневом контексте для сопоставления запросов.Вы можете либо:
2.1.В корневом контексте исключите @Controller
из <component-scan>
и сканируйте @Controller
только в файле dispatcher-servlet.xml.
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>