为了以编程方式刷新资源包缓存,我使用的是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类型的消息源。
答案 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