2013-08-28 4 views
6

JSFページに<f:viewParam>というタグがあり、変換および検証後に対応するマネージドBeanにGETパラメータを設定します。<f:viewParam>のバリデーション/変換エラーは、<f:view locale>にデフォルトロケールにローカライズされません。

変換エラーまたは検証エラーのいずれかが発生すると、適切なエラーメッセージがリソースバンドルから取得され、<p:messages><p:growl>または<h:messages>)に表示されます。

アプリケーションは多言語対応です。したがって、別の言語を選択すると、その言語でメッセージが表示されますが、デフォルトのロケールen(英語)に従ってメッセージが常に表示されます。

Test.xhtml:

<!DOCTYPE html> 
<html lang="#{localeBean.language}" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

    <f:view locale="#{localeBean.locale}"> 
     <f:metadata> 
      <f:viewParam name="id" converter="#{myConverter}" /> 
     </f:metadata> 
     <h:head> 
      <title>Test</title> 
     </h:head> 
     <h:body> 
      <h:messages /> 
     </h:body> 
    </f:view> 
</html> 

コンバータ:<f:viewParam>からのメッセージを除き

@FacesConverter("myConverter") 
public final class MyConverter implements Converter 
{ 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     ResourceBundle bundle = context.getApplication() 
      .evaluateExpressionGet(context, "#{messages}", ResourceBundle.class); 
     String message = bundle.getString("id.conversion.error"); 
     throw new ConverterException(
      new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     throw new UnsupportedOperationException(); // Not relevant in this problem. 
    } 
} 

、問題はありません。他のすべての種類のメッセージは、ユーザーが選択した言語で表示されます。

<f:viewParam>には特別なものはありますか?

答えて

5

問題を再現できます。 Mojarra 2.1.25とMyFaces 2.1.12の両方で同じ問題が発生します。したがって、JSF仕様のバグか、JSF仕様の見落としかどうかはわかりません。これまでは、レンダリング応答フェーズに入る前に、viewrootロケールがGET要求に対して設定されていないことが分かりました。コンバータはレンダリング応答のはるか前の検証段階で実行されるため、代わりにデフォルトのロケールが得られた理由が説明されています。私は後でそれを調査し、必要ならMojarraに問題を報告しなければならない。ところで

、この問題を解決するための最善の策は、<resource-bundle><var>をEL-評価するのではなく、次のようにバンドルを得ることである:

String basename = "com.example.i18n.message"; // Exactly the same as <resource-bundle><base-name> 
Locale locale = context.getApplication().evaluateExpressionGet(context, "#{localeBean.locale}", Locale.class); 
ResourceBundle bundle = ResourceBundle.getBundle(basename, locale); 
// ... 

更新:私はissue 3021などを報告しましたこの問題ごとに。私はまだ仕様が何を言っているのかを頭で覆すことはできませんが、実装の振る舞いは直感的ではありません。


アップデート2:クロサギ科とMyFacesの人がこれに同意しました。 Mojarraの場合、2.2.5(まだ2.1.xのバックポートはありません)あたりfixedでした。MyFacesの場合は、2.0.19,2.1.13、および2.2.0のようにfixedでした。

+0

このメソッドは 'evaluateExpressionGet(String expression)'には見えません。代わりに 'public T evaluateExpressionGet(FacesContextコンテキスト、文字列式、クラス expectedType)のみが「ELException'をスローします。そこにいますか? – Tiny

+0

申し訳ありませんが、私は(実際には、org.omnifaces.util.Faces'から静的なインポートを使用していた)単純化されたサンプルを投稿し、メソッドの仕事に関するヒントを理解していると誤って想定しました。私は答えを更新しました。 – BalusC

+0

ビューのメタデータが処理され、外側のf:viewタグは考慮されていませんが、理論的にはf:viewは特別なものであるため、そうであってはいけません。私のバグのように見えます。 – lu4242

関連する問題