我使用Spring来显示属性文件中的消息。我希望能够覆盖<spring:message>
标记,以根据登录用户使用数据库中的值。如果此值不存在,我希望它现在默认为属性文件中的值。
有人可以帮我这个代码吗?我已经阅读了关于AbstractMessageSource但我不清楚如何实现它。
由于
答案 0 :(得分:9)
您必须实现自定义消息源。它是一个扩展AbstractMessageSource
并实现抽象resolveCode(java.lang.String, java.util.Locale)
方法的类。 SO上几乎same question(这是Grails的解决方案),但我认为从...开始是好点...
看看Spring论坛中的那些主题:
答案 1 :(得分:2)
我最终在下面创建了一个名为DatabaseMessageSource的类。我仍然需要实现某种缓存,所以我不会在每次调用时都访问数据库。这个link也很有帮助。谢谢skaffman和PrimosK指出我正确的方向。
public class DatabaseMessageSource extends ReloadableResourceBundleMessageSource {
@Autowired
private MyDao myDao;
protected MessageFormat resolveCode(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
MessageFormat format;
if (myObj!= null && myObj.getId() != null) {
format = new MessageFormat(myObj.getValue(), locale);
} else {
format = super.resolveCode(code, locale);
}
return format;
}
protected String resolveCodeWithoutArguments(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
String format;
if (myObj != null && myObj.getId() != null) {
format = myObj.getValue();
} else {
format = super.resolveCodeWithoutArguments(code, locale);
}
return format;
}
}
我更新了我的applicationContext以指向新创建的类。 我改成了:
<bean id="messageSource" class="com.mycompany.mypackage.DatabaseMessageSource">
<property name="basenames">
<list>
<value>classpath:defaultMessages</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>`enter code here`
答案 2 :(得分:1)
您无需更改<spring:message>
的行为,只需更改其获取消息的位置即可。
默认情况下,它在上下文中使用messageSource
bean,类型为MessageSource
,或其某些子类。您可以编写自己的实现MessageSource
的类,并将其作为messageSource
bean添加到您的上下文中。
AbstractMessageSource
只是编写自己的MessageSource
的便捷起点。它为你完成了一些工作,只是将它子类化。