如何注入Spring ReloadableResourceBundleMessageSource

时间:2009-04-08 03:47:12

标签: spring

为了以编程方式刷新资源包缓存,我使用的是Spring的ReloadableResourceBundleMessageSource。我无法将其注入我想要调用clearCache()方法的bean中。

我不得不采取以下措施:

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类型的消息源。

4 个答案:

答案 0 :(得分:2)

我认为按类型自动装配在这种情况下不起作用,因为autowire候选者很可能是ApplicationContext本身(参见参考文档的section 3.8.2)。这会导致您需要挖掘所有这些图层以获取原始ReloadableResourceBundleMessageSource

尝试通过XML配置传递对messageSource bean的引用。用@Qualifier('messageSource')注释属性应该也可以。

答案 1 :(得分:2)

当Spring无法找到“messageSource”时,通常会注入DelegatingMessageSource。您确定要正确定义它还是在必要时可见?我认为这里的问题是如何设置XML配置。

我遇到了与Spring Web Flow和表单动作相似的情况。在我的XML配置中,“messageSource”不可见,导致DelegatingMessageSource被注入。我将“messageSource”bean定义放入webflow配置中,然后一切正常,我停止获取DelegationMessageSource对象。但是,这是一个丑陋的修复,因为现在我在两个地方定义了“messageSource”。

无论如何,这个问题才在我切换到Spring 2.5.6之后才开始。我正在使用Webflow 1.一旦有机会,我将尝试更新到Webflow 2,看看会发生什么。也许这将解决问题。

答案 2 :(得分:0)

您是否尝试将方法定义为:

public void setMessageSource(ReloadableResourceBundleMessageSource messageSoure) {
    this.messageSoure = messageSoure;
}

答案 3 :(得分:0)

当您尝试在控制器中通过messageSource运行它时,您会得到NOTHING,空字符串。如果你仔细观察,你会发现你的messageSource属性中有一个DelegatingMessageSource,它有一个空的父源,这意味着它是EMPTY,即总是返回空白,这个异常发生在控制器中

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

Read more..