Перемещение messageSource в applicationContext приводит к тому, что defaultSource по умолчанию не отображается в контексте диспетчера-сервлета - PullRequest
8 голосов
/ 02 марта 2011

У меня есть веб-приложение, в котором я определяю базовый dispatcher-servlet контекст в web.xml, и оно загружает applicationContext.

. Я определил messageSource в dispatcher-servlet и вводил его вКонтроллеры в порядке.

У меня также есть службы, определенные в applicationContext, и я могу внедрить их в свои контроллеры (определенные в контексте dispatcher-servlet).

Но когда я переместил свое определение для messageSource до applicationContext, чтобы некоторые службы могли разрешать сообщения; контекст dispatcher-servlet показывает, что он не находит компонент messageSource и использует значение по умолчанию, поэтому контроллеры вводят неверный компонент.

Любая идея, почему определение messageSource в applicationContext не было бы видимым для контекста dispatcher-servlet?


Я вижу, что мой bean-компонент messageSource загружен в секцию applicationContext журналов:
2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating shared instance of singleton bean 'messageSource'
2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating instance of bean 'messageSource'
...
2082 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Using MessageSource [mycommons.spring.ResourceBundleMessageSourceWithDefaultResolution: basenames=[messages]]


Я вижу этот журнал при загрузке dispatcher-servlet:

3858 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@55611ed3]

Ответы [ 2 ]

13 голосов
/ 02 марта 2011

Так оно и есть. messageSource bean должен быть определен в контексте, в котором он будет использоваться. Он не будет «унаследован» от родительского контекста к дочернему.

Это что-то вроде возврата к ранним дням Spring 1.x, и с тех пор оно никогда не менялось.

Существует несколько «волшебных бобов», которые должны быть размещены непосредственно в приложении appcontext, и это один из них.

1 голос
/ 03 октября 2013

Сегодня я нашел «другое» решение, которое работает (для меня это работает в Spring 3.1, но я предполагаю, что оно будет работать и в более ранних версиях, атрибут parent уже давно существует). Он по-прежнему будет создавать 2 компонента, но не требует, чтобы вы добавили полное определение компонента во второй раз в файл xxx-servlet.xml:

В вашем приложенииContext.xml:

<bean id="baseMessageSource" class="org.springframework...YourMessageSourceClass">
   ...
</bean>

В вашем xxx-servlet.xml:

<bean id="messageSource" parent="baseMessageSource" />

Вторая ссылка просто "клонирует" базовый компонент из контекста вашего приложения и делает его доступным для вашего сервлета / контроллеров и т. Д. Таким образом, вы даже можете переопределить части конфигурации вашего источника сообщений в сервлете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...