覆盖Spring:带有数据库值的消息标记
我使用Spring来显示属性文件中的消息。 我希望能够覆盖标记,以根据登录用户使用数据库中的值。 如果此值不存在,我希望它现在默认为属性文件中当前的值。
有人可以帮我这个代码吗? 我已经阅读了有关AbstractMessageSource但我不清楚如何实现它。
谢谢
您必须实现自定义消息源。 它是一个扩展AbstractMessageSource
并实现抽象resolveCode(java.lang.String, java.util.Locale)
方法的类。 关于SO(它是Grails的解决方案)几乎有同样的问题 ,但我认为从…开始是好点。
看看Spring论坛中的那些主题:
- AbstractMessageSource使用DB表而不是props文件?
- i18n和数据库
- i18n的数据库支持的resourcebundle并动态添加新的lang
- 数据库驱动的资源包 – 示例和最佳实践?
我最终在下面创建了一个名为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以指向新创建的类。 我改成了:
classpath:defaultMessages
`enter code here`
您无需更改
的行为,只需更改其获取消息的位置即可。
默认情况下,它在上下文中使用messageSource
bean,该类型是MessageSource
类型或其某些子类。 您可以编写自己的实现MessageSource
的类,并将其作为messageSource
bean添加到您的上下文中。
AbstractMessageSource
只是编写自己的MessageSource
一个方便的起点。 它为你做了一些工作,只是它的子类。