2011-07-22 1 views
1

私は、それぞれのリクエストに対して作成されたmessageResourceのプロトタイプ(シングルトンかもしれないと思います)セッション内のUserオブジェクトから取得したロケール。そのため、ロケールを渡す必要はありません。検証メッセージだけをローカライズする必要はなく、例外メッセージなどをローカライズする必要がない場合は非常に不便です。2つの例外境界がある場合は、その問題です。 1つは、サービスへの参照を渡すか、またはそれらを集約するいくつかのコンテキストを持っていなければならず、すべてが1つの場所で行われます。SpringのmessageResourceは、セッションから暗黙的にローカライズされています - ロケール参照を渡す必要はありません

他の理由で既にResourceBundleMessageSourceが拡張されているため、ロケール状態になる可能性がありますが、この問題の最適な方法は何か分かりません。

短縮版:リクエストがセッションからハンドラ、グラブユーザーまたはロケールに渡され、コンテキストからCustomMessageSourceを取得し、それを移植されている>コントローラで利用可能な同じCustomMessageSourceインスタンスがすでに

をローカライズしているあなたは、問題はありませんリクエストが来たら、MessageSourceはセッションから自動的に "ローカライズ"されますか?

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

@Autowired private MessageSource resource;

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

答えて

1

右は今、このためのボックスのサポートのない外ありませんが、あなたは簡単にカスタムコンポーネントを考え出すことができることを委任する順番にMessageSourceからLocaleResolver及び代表者の解像度の呼び出しにLocale解像度:

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(); 
    } 
} 

そのコンポーネントをSpring MVCコントローラに注入すると、コントローラメソッドのシグネチャを介してLocaleパイプを使わずにメッセージを解決できます。 JIRA ticketを開いて、Springコードベースに追加された機能強化を提案しました。

関連する問題