2009-08-18 21 views
0

私は、URIからロケール(リクエストパラメータではなくURI自体)を取得するカスタムActionMapperを実装しました。 ActionMapper.getMapping()内から、現在のアクションのロケールを設定するにはどうすればよいですか?カスタムStruts 2 ActionMapperでロケールを設定する方法

は、ここで私が考えられてきたいくつかのアイデアです:。

  • ActionContext.getCurrent()にsetLocale()。残念ながら、アクションが呼び出されたときに新しく新しいActionContextが作成され、ロケールがデフォルトにリセットされたようです。
  • パラメータrequest_localeを設定します。このパラメータは、i18nインターセプタによって処理されます。残念ながら、i18nインターセプタは、現在のアクションだけでなく、現在のセッションでもロケールの設定を主張しています。これは、アプリケーションでセッションが有効になっていないため例外がスローされます。
  • パラメータを設定し、setLocale()を実装してアクション自体で処理します。これはまっすぐですが、インターセプタのどれもがロケールにアクセスできないことを意味します。
  • パラメータを設定してインターセプタを書き込みます(基本的には、セッションのサポートを前提としないでi18nインターセプタと同じことを行います)。このような単純な問題のために、車を再発明することは言うまでもありません。

これを達成する簡単な方法はありますか?

+0

あなたのインターセプタ全体のロケールが必要な場合は、私はあなたがカスタムの国際化インターセプターとホイールを再発明し立ち往生していると思います。私は、ActionContextが再作成されたことに驚いています - 私はあなたの最初のアイデアもうまくいくと考えました。 – Pat

答えて

0

実際には、パラメータ「ロケール」を設定し、i18nインターセプタに書き換えを行いました。

Struts 2.1.1以降、ActionMappingのパラメータは要求パラメータとは別に保持されます。 actionMappingParamsインターセプタは、これらのパラメータを受け取り、それらをアクションオブジェクトに適用します。しかし、私はアクションへのパススルーそれを「ロケール」パラメータとないを消費するために私の国際化インターセプターを望んでいた、ここに私はそれをやった方法は次のとおりです。

private static final String LOCALE_PARAMETER = "locale"; 

public String intercept(ActionInvocation invocation) throws Exception { 
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext() 
     .get(ServletActionContext.ACTION_MAPPING); 
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER); 

    if(locale != null) { 
     ActionContext.getContext().setLocale(locale); 
    } 

    return invocation.invoke(); 
} 

このカスタム国際化インターセプターは、インターセプタスタック内actionMappingParamsの前に来なければなりません。

1

あなたはのparam設定したときは、提供I18nInterceptorを使用することができます。代わりに request_localeの request_only_locale

request_only_localeのみリクエストのロケールを格納し、セッションには触れていませんが。

乾杯、 クリスチャン

+0

良い解決策。私はこれが、私が元の質問をしたときに使用していたStruts2のどのバージョンでも利用できなかったと推測しています(I18nInterceptorソースを経由したと確信しています)。 –

関連する問題