2012-05-16 3 views
7

私は、プロパティファイルからメッセージを表示するためにSpringを使用しています。 <spring:message>タグを無効にして、ログインしたユーザーに基づくデータベースの値を使用したいと考えています。この値が存在しない場合は、現在のプロパティファイルの値にデフォルト値を設定したいと思います。オーバーライドスプリング:データベース値のメッセージタグ

誰かがこのコードを教えてくれますか?私はAbstractMessageSourceについて読んだことがありますが、実装方法は不明です。

ありがとうございました

答えて

7

カスタムメッセージソースを実装する必要があります。それはAbstractMessageSourceを拡張し、抽象的resolveCode(java.lang.String, java.util.Locale)メソッドを実装するクラスです。春のフォーラムでこれらのスレッドを見てみましょあり、ほぼsame question SO(Grailsのためのそれの解決策)のですが、私はから開始する良い点だと思います...

1

<spring:message>の動作を変更する必要はありません。メッセージを取得する場所を変更するだけで済みます。

デフォルトでは、コンテキスト内でmessageSourceのBeanを使用します。コンテキストは、タイプMessageSourceまたはそのサブクラスです。 MessageSourceを実装する独自のクラスを作成し、それをmessageSource beanとしてコンテキストに追加できます。

AbstractMessageSourceは、自分自身を書くのに便利な出発点です。MessageSourceそれはあなたのためにいくつかの作業を行い、サブクラス化するだけです。

2

私は、以下に含まれるDatabaseMessageSourceというクラスを作成しました。私はまだいくつかの種類のキャッシュを実装する必要があるので、私は各呼び出しでデータベースにヒットしません。このlinkも参考になりました。正しい方向に向いてくれてありがとう、スカフマンとプリモスキー。

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を更新しました。 私はそれを変更する:私はEhcacheのをお勧めし、キャッシングのために

<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` 
+0

、... [この](http://ehcache.org/documentation/recipes/thunderingherd)を見て、[この](HTTP: //ehcache.org/documentation/recipes/spring-annotations).... – PrimosK

+0

ありがとうございます。私は最初のリンクを実装します。あなたは本当に役に立ちました。再度ありがとう – blong824

+0

1つのフォローアップの質問。コントローラからDatabaseMessageSourceクラスにオブジェクトを渡すにはどうしたらいいですか?オブジェクトは、spring:messageタグを含む画面がロードされるまでにセッション中です。 – blong824

関連する問題