0

ResourceBundle 生成の静的コンストラクターを持つ 1 つの基本コントローラーを拡張するコントローラーがたくさんあります。

static {
   resources = ResourceBundle.getBundle("com.resource.Resources");
}

アプリのロジックはビューだけでなくロケールに基づいているため、必要です。

さらにCookieLocaleResolver、Cookie から現在のロケールを解決する があります。

問題は、基本コントローラーの静的コンストラクター コードが CookieLocaleResolver の resolveLocale メソッドの前に実行されるため、現在のロケールではなく、常に ResourceBundle でシステムのデフォルト ロケールを受け取ることです。

どうすれば解決できますか?ありがとうございました

4

1 に答える 1

1

これは、staticブロックがクラスの初期化時に実行されるためです。ResourceBundleコントローラーが呼び出されたときにロードする必要があります。ここでは、コントローラーを として定義し、ResourceBundle をロードするためにprototype使用することをお勧めします。InitializingBean

public class MyController implements InitializingBean {
    private ResourceBundle resources;

    public void afterPropertiesSet() {
         resources = ResourceBundle.getBundle("com.resource.Resources");
    }
}

より良い方法はResourceBundleMessageSource、ResourceBundle を直接使用せずに使用することです。可能であれば、ResourceBundle を直接管理する必要がないため、はるかに簡単になります。

それがあなたを助けることを願っています。

[編集]

Spring MessageSource は、パラメーターを使用してメッセージを解決するメソッドを提供します。アプリケーションでを定義するMessageSourceと、ビュー (たとえば JSP ページ) で同じメッセージにアクセスすることもできます。最後に、設計上、コントローラーがリソース バンドルを直接参照しない方が良いでしょう。このようにして、ラベル/メッセージは単一の場所 (MessageSource を宣言するときの Spring 構成内) で管理されます。

于 2013-06-27T18:19:17.127 に答える