Как внедрить Spring ReloadableResourceBundleMessageSource

Чтобы программно обновить кэш пакета ресурсов, я использую Spring ReloadableResourceBundleMessageSource. У меня возникли проблемы с внедрением его в мой bean-компонент, где я хочу вызвать метод clearCache().

Мне пришлось прибегнуть к следующему:

private ReloadableResourceBundleMessageSource messageSource;

@Autowired
public void setMessageSource(MessageSource messageSource) {
  this.messageSource = (ReloadableResourceBundleMessageSource((DelegatingMessageSource)messageSource).getParentMessageSource();
}

Это работает, но должен быть лучший способ. Ресурс сообщения определяется следующим образом:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" >
<list>
   <value>WEB-INF/content/Content</value>
 </list>
 </property>
</bean>

Я не понимаю, почему Spring вводит источник сообщения типа DelegatingMessageSource.


person Joel    schedule 08.04.2009    source источник


Ответы (4)


Я не думаю, что автосвязывание по типу будет работать в этом случае, поскольку кандидатом на автосвязывание, скорее всего, будет сам ApplicationContext (см. раздел 3.8.2 справочной документации). Это приводит ко всем тем слоям, которые вам нужно перекопать, чтобы получить исходный ReloadableResourceBundleMessageSource.

Вместо этого попробуйте передать ссылку на bean-компонент messageSource через XML-конфигурацию. Аннотирование свойства с помощью @Qualifier('messageSource') также должно работать.

person Nils Wloka    schedule 15.04.2009
comment
Я уже пытался подключить компонент через конфигурацию XML, но получаю те же результаты. Я еще не пробовал @Qualifier. Я попробую. Спасибо. - person Joel; 15.04.2009
comment
Автосвязывание по имени, являющееся запасным методом @Qualifier, в этом случае также не поможет. Использование элемента ‹qualifier› с определением MessageSource (static.springframework.org/spring/docs/2.5.x/reference/) может помочь. - person Nils Wloka; 16.04.2009
comment
В качестве альтернативы сделайте свой клиент MessageSource ApplicationContextAware и получите программный доступ к компоненту 'messageSource'. - person Nils Wloka; 16.04.2009
comment
Как указал Springify, если у вас есть @autowired MessageSource, Spring всегда будет давать вам ссылку на собственный внутренний MessageSource контекста приложения, который делегирует любые другие, которые он мог найти. Если вы этого не хотите, полностью удалите аннотацию @autowired и вручную внедрите свой компонент MessageSource. Не связывайтесь с @Qualifier и т.п., это не должно быть так сложно. - person skaffman; 17.04.2009

Обычно вы вводите DelegatingMessageSource, когда Spring не может найти определенный «messageSource». Вы уверены, что правильно определяете его или что он виден там, где это необходимо? Я думаю, что проблема здесь в том, как была настроена конфигурация XML.

У меня была аналогичная ситуация с Spring Web Flow и действиями формы. В моей конфигурации XML «messageSource» не был виден и вызывал внедрение DelegatingMessageSource. Я поместил определение bean-компонента «messageSource» в конфигурацию веб-потока, после чего все заработало, и я перестал получать объект DelegationMessageSource. Однако это уродливое исправление, так как теперь у меня есть «messageSource», определенный в двух местах.

Во всяком случае, эта проблема началась только после того, как я перешел на Spring 2.5.6. Я использую Webflow 1. Как только у меня будет шанс, я попробую обновиться до Webflow 2 и посмотреть, что произойдет. Возможно, это решит проблему.

person Community    schedule 25.05.2009

Вы пытались определить метод как:

public void setMessageSource(ReloadableResourceBundleMessageSource messageSoure) {
    this.messageSoure = messageSoure;
}
person Vladimir    schedule 08.04.2009
comment
Да, это то, что я сделал сначала, но это не удалось при инициализации с ошибкой о том, что не найден bean-компонент типа ReloadableResourceBundleMessageSource. - person Joel; 10.04.2009

Когда вы пытаетесь запустить его через messageSource в своем контроллере, вы получаете НИЧЕГО, пустую строку. И если вы внимательно посмотрите, вы обнаружите, что у вас есть DelegatingMessageSource в вашем свойстве messageSource с пустым родительским источником, что означает, что он ПУСТОЙ, т.е. всегда возвращает пустое, и это исключение возникает в контроллере

ReloadableResourceBundleMessageSource incompatible with org.springframework.context.support.DelegatingMessageSource

Подробнее...

person Muhammad Imran Tariq    schedule 01.01.2013