覆盖Spring:带有数据库值的消息标记

时间:2012-05-16 17:12:35

标签: java spring properties messages

我使用Spring来显示属性文件中的消息。我希望能够覆盖<spring:message>标记,以根据登录用户使用数据库中的值。如果此值不存在,我希望它现在默认为属性文件中的值。

有人可以帮我这个代码吗?我已经阅读了关于AbstractMessageSource但我不清楚如何实现它。

由于

3 个答案:

答案 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的便捷起点。它为你完成了一些工作,只是将它子类化。