1

この記事とドキュメントによると:

Spring コンテナーの初期化中に、MessageSourceAware インターフェースを実装するクラスがあれば、Spring は setMessageSource(MessageSource messageSource) セッター メソッドを介して自動的に 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 に対して正確にセッター メソッドを必要とし、オーバーライドされたクラスをパラメーターとして取得できないことです。反対側から、MessageSource をオブジェクトにキャストできません。例外で失敗します。

そのようなことを実装することは可能ですか?

ありがとうございました

4

1 に答える 1

3

一般的に、あなたの問題を理解していません。JavaDocsからMessageSourceAware:

実行される MessageSource (通常は ApplicationContext) の通知を希望する任意のオブジェクトによって実装されるインターフェイス。

MessageSource は、アプリケーションコンテキストで「messageSource」という名前の Bean として定義されているため、通常、Bean 参照として (任意の Bean プロパティまたはコンストラクター引数に) 渡すこともできることに注意してください。

したがって、実装をmessageSource Bean として構成するだけです。

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

そして、あなたのサービスは単に実装する必要がありますMessageSourceAware. もちろん、これらのクラスではMessageSource、必要に応じて実装にキャストできます。

ドキュメントはこちら: MessageSource を使用した国際化

于 2013-10-11T08:25:01.050 に答える