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、コンテキスト内の BeanMessageSourceまたはそのサブクラスを使用します。実装する独自のクラスを作成し、それをBeanMessageSourceとしてコンテキストに追加できます。messageSource

AbstractMessageSourceは、独自のMessageSource. サブクラス化するだけで、いくつかの作業が行われます。

于 2012-05-16T18:01:50.120 に答える