覆盖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一个方便的起点。 它为你做了一些工作,只是它的子类。