1

リクエストごとにmessageResourceのプロトタイプ(シングルトンでもかまいません)を作成し、セッションでUserオブジェクトから取得したリクエストのロケールまたはロケールを入力する最良の方法は何でしょうか。そのため、ロケールを渡す必要はありません。これは、検証メッセージだけでなく、例外メッセージなどもローカライズする必要がない場合は非常に不便です。例外境界が2つある場合は、問題が発生します。次に、サービスへの参照を渡すか、サービスを集約するコンテキストを用意する必要があり、すべてが1か所で実行されます。

他の理由ですでにResourceBundleMessageSourceを拡張しているので、ロケール状態になる可能性がありますが、この問題に対する最善のアプローチがわかりません。

短いバージョン:リクエストがハンドラーに渡されるときに、セッションからユーザーまたはロケールを取得し、コンテキストからCustomMessageSourceを取得してデータを入力します>コントローラーで使用可能な同じCustomMessageSourceインスタンスを既にローカライズします

リクエストが来たときにMessageSourceがセッションから自動的に「ローカライズ」されることに問題はありませんか?

アプリコンテキスト内のすべての参照は、ローカライズされたmessageResourceを指します。

@AutowiredプライベートMessageSourceリソース;

サーブレット環境にはSPR-8555を、ポートレット環境にはSPR-8558に投票できます。

4

1 に答える 1

1

Locale現在、これに対するすぐに使用できるサポートはありませんが、解決をaLocaleResolverに委任し、解決呼び出しをaに委任するカスタムコンポーネントを簡単に思い付くことができますMessageSource

public class LocalizedMessageSource {

  private final MessageSource messageSource;
  private final LocaleResolver localeResolver;

  public LocalizedMessageSource(MessageSource messageSource, 
                                LocaleResolver localeResolver) {
    Assert.notNull(messageSource);
    Assert.notNull(localeResolver);
    this.messageSource = messageSource;
    this.localeResolver = localeResolver;
  }

  public String getMessage(MessageSourceResolvable resolvable) {
    return messageSource.getMessage(resolvable, getLocale());

  public String getMessage(String code, Object[] args) {
    return messageSource.getMessage(code, args, getLocale());

  getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
    return messageSource.getMessage(code, args, defaultMessage, getLocale()); 
  }

  private Locale getLocale() {
    return localeResolver.resolveLocale(getCurrentRequest());
  }

  private HttpServletRequest getCurrentRequest() {
    return ((ServletRequestAttributes) RequestContextHolder
      .currentRequestAttributes()).getRequest();
  }
}

そのコンポーネントをSpringMVCコントローラーに注入するとLocale、コントローラーのメソッドシグネチャを介してパイプされることなくメッセージを簡単に解決できます。Springコードベースに追加された拡張機能を提案するためにJIRAチケットを開きました。

于 2011-07-23T11:40:59.290 に答える