1

由于这篇文章和文档:

在 Spring 容器初始化过程中,如果有任何类实现了 MessageSourceAware 接口,Spring 会通过 setMessageSource(MessageSource messageSource) setter 方法自动将 MessageSource 注入到该类中。

但是该对象的访问方法不是很有用,所以我想覆盖该接口并添加一些更有用的方法:

public class MessageSourceEx implements org.springframework.context.MessageSource {

    /**
     * 
     */
    @Override
    public String getMessage(MessageSourceResolvable source, Locale locale)
            throws NoSuchMessageException {
        return this.getMessage(source, locale);
    }

    /**
     * 
     */
    @Override
    public String getMessage(String key, Object[] params, Locale locale)
            throws NoSuchMessageException {
        return this.getMessage(key, params, locale);
    }

    /**
     * 
     */
    @Override
    public String getMessage(String key, Object[] params, String locale, Locale locale2) {
        return this.getMessage(key, params, locale, locale2);
    }

    /**
     * 
     * @param locale Locale
     * @param key Key
     * @param params Parameters
     * @return
     */
    public String getMessage(Locale locale, String key, Object... params) {
        return this.getMessage(key, new Object[] {params}, locale);
    }

    /**
     * 
     * @param locale Locale
     * @param key Key
     * @return
     */
    public String getMessage(Locale locale, String key) {
        return this.getMessage(key, null, locale);
    }
}

但问题是MessageSourceAware接口需要完全用于 MessageSource 的 setter 方法,并且无法将我的覆盖类作为参数。从另一边,我无法将 MessageSource 强制转换为我的对象 - 它失败并出现异常。

有可能实现这样的事情吗?

谢谢

4

1 回答 1

3

一般不明白你的问题。来自MessageSourceAwareJavaDocs:

由希望被通知其运行的 MessageSource(通常是 ApplicationContext)的任何对象实现的接口。

请注意,MessageSource 通常也可以作为 bean 引用传递(到任意 bean 属性或构造函数参数),因为它在应用程序上下文中被定义为名称为“messageSource”的 bean。

因此,只需将您的实现配置为messageSource bean:

<bean id="messageSource" class="com.my.proj.FooMessageSource"/>

并且您的服务应该只实施MessageSourceAware. 当然,MessageSource如果需要,您可以在这些类中强制转换为您的实现。

文档在这里:使用 MessageSource 进行国际化

于 2013-10-11T08:25:01.050 回答