我正在使用 Spring 来显示来自属性文件的消息。我希望能够覆盖<spring:message>
标签以使用基于登录用户的数据库中的值。如果此值不存在,我希望它像现在一样默认为属性文件中当前的值。
有人可以帮我处理这段代码吗?我读过关于 AbstractMessageSource 但我不清楚如何实现它。
谢谢
我正在使用 Spring 来显示来自属性文件的消息。我希望能够覆盖<spring:message>
标签以使用基于登录用户的数据库中的值。如果此值不存在,我希望它像现在一样默认为属性文件中当前的值。
有人可以帮我处理这段代码吗?我读过关于 AbstractMessageSource 但我不清楚如何实现它。
谢谢
您必须实现自定义消息源。它是一个扩展AbstractMessageSource
和实现抽象resolveCode(java.lang.String, java.util.Locale)
方法的类。关于 SO(它是 Grails 的解决方案)几乎有相同的问题,但我认为从...开始是个好主意
我最终创建了一个名为 DatabaseMessageSource 的类,包含在下面。我仍然需要实现某种缓存,这样我就不会在每次调用时都访问数据库。这个链接也很有帮助。感谢 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`
您无需更改 的行为<spring:message>
,只需更改它从中获取消息的位置。
默认情况下,它messageSource
在上下文中使用 bean,它是 typeMessageSource
或其某个子类。您可以编写自己的类来实现并将其作为beanMessageSource
添加到您的上下文中。messageSource
AbstractMessageSource
只是编写自己的MessageSource
. 它为你做了一些工作,只是子类化它。