Spring を使用して、プロパティ ファイルからメッセージを表示しています。<spring:message>
ログインしたユーザーに基づいてデータベースの値を使用するようにタグをオーバーライドできるようにしたいと考えています。この値が存在しない場合は、現在プロパティ ファイルにある値をデフォルトに設定したいと思います。
誰かがこのコードで私を助けることができますか? AbstractMessageSource について読んだことがありますが、実装方法がわかりません。
ありがとう
Spring を使用して、プロパティ ファイルからメッセージを表示しています。<spring:message>
ログインしたユーザーに基づいてデータベースの値を使用するようにタグをオーバーライドできるようにしたいと考えています。この値が存在しない場合は、現在プロパティ ファイルにある値をデフォルトに設定したいと思います。
誰かがこのコードで私を助けることができますか? AbstractMessageSource について読んだことがありますが、実装方法がわかりません。
ありがとう
カスタムメッセージソースを実装する必要があります。AbstractMessageSource
これは、抽象resolveCode(java.lang.String, java.util.Locale)
メソッドを拡張および実装するクラスです。SO(Grailsの解決策)についてもほぼ同じ質問がありますが、最初から始めるのが良い点だと思います...
結局、以下に含まれる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`
の動作を変更する必要はありません<spring:message>
。メッセージを取得する場所を変更するだけで済みます。
デフォルトではmessageSource
、コンテキスト内の BeanMessageSource
またはそのサブクラスを使用します。実装する独自のクラスを作成し、それをBeanMessageSource
としてコンテキストに追加できます。messageSource
AbstractMessageSource
は、独自のMessageSource
. サブクラス化するだけで、いくつかの作業が行われます。