Я сконфигурировал корневой контекст приложения, используя ContextLoaderListener и контекстный init-parameter contextConfigLocation.
После этого корневой контекст получает доступ к JSF (*.jsf) variable-resolver. Он отлично работает.
Теперь проблема заключается в том, что запросы (*.do), идущие через DispatcherServlet, получат другой контекст приложения, а затем один экземпляр beans создается дважды.
Мне не нужен другой контекст приложения для DispatcherServlet, как я могу указать его для повторного использования существующего корневого контекста приложения, который загружается ContextLoaderListener?
Примечание
После чтения справочных страниц в ответах я знаю, что существует контекстное разделение между корневым контекстом и контекстом диспетчера, но ни одна из ссылок не говорит мне, куда идти. Итак, вот мое решение, возможно, полезно для других людей, сталкивающихся с похожим вопросом:
-
В контексте config XML для сервлета диспетчера:
dispatcher-servlet.xml, я дублировал определенный<context:component-scan/>, который уже определен в корневом контексте. Так что удалите его.dispatcher-servlet.xmlдолжен определять только те beans, которые используются только для 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>