10

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

有人可以帮我处理这段代码吗?我读过关于 AbstractMessageSource 但我不清楚如何实现它。

谢谢

4

3 回答 3

11

您必须实现自定义消息源。它是一个扩展AbstractMessageSource和实现抽象resolveCode(java.lang.String, java.util.Locale)方法的类。关于 SO(它是 Grails 的解决方案)几乎有相同的问题,但我认为从...开始是个好主意

于 2012-05-16T17:54:36.663 回答
3

我最终创建了一个名为 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`
于 2012-05-16T21:56:54.660 回答
1

您无需更改 的行为<spring:message>,只需更改它从中获取消息的位置。

默认情况下,它messageSource在上下文中使用 bean,它是 typeMessageSource或其某个子类。您可以编写自己的类来实现并将其作为beanMessageSource添加到您的上下文中。messageSource

AbstractMessageSource只是编写自己的MessageSource. 它为你做了一些工作,只是子类化它。

于 2012-05-16T18:01:50.120 回答