2013-10-24 78 views
6

Java EE 6からJava EE 7に移行しましたが、JSF 2.2ではコンテキスト・パラメータINTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLが動作していないようです。 JSF 2.1では "true"に設定していますが、これは完全に機能しますが、今は空の文字列を取得します。JSF 2.2で空文字列の値がNULLとして動作していないと解釈しました

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

誰かがそれについて何か言うことができますか?

+0

実装上のバグかもしれません。環境をデバッグして、それがmojarraソースのバグかどうかを確認できますか? –

+1

Java EE 7/EL 3.0以来、[javax.faces.INTERPRET \ _EMPTY \ _STRING \ _SUBMITTED \ _VALUES \ _AS \ _NULLの複製はもう使用できません](http://stackoverflow.com/questions/21880017/javax-faces -interpret-empty-string-submitted-values-as-null-does-not-work-anymor) – BalusC

答えて

6

最新のMojarra-2.2.5 とWildfly 8 Finalのglassfish 4でも同じことが起こります。 。 。私はこれについて複数のバグレポートを見ましたが、Manfried Riemは「これはELの問題であり、EL実装はこれを修正するために修正されました」と言っていますが、GlassfishにはないのでMojarraを更新する4.私もエルを更新しましたが、それもうまくいきませんでした。

+1

私は結局のところ、カスタムリゾルバでこの問題を解決しています。リンクhttps://java.net/jira/browse/ JAVASERVERFACES_SPEC_PUBLIC-1203あなたに役立つことを願っています – onsm7

+0

100%感謝しました! – Sphynx

0

今はもっと混乱します。 JSF 2.2.8-SNAPSHOTを使用していますが、値がJSF Bean検証中にnullとして解釈されますが、実際の値セットは空のStringです。これは、検証を行う他のコンポーネント、例えば、文字列値が ""であるため、JPAは長さの検証に失敗します。

これは明らかにspec changeが必要なので、私はすぐにこのことを期待しません。 jiraには、このpostに記載されている回避策も含まれています。

ps。 documentationは、nullがBean検証フレームワークに渡されると述べているため、これは正しい動作かもしれませんが、これは直感的ではありません。

1

Apache el実装は、空の文字列(または0のint値)を行います。あなたはorg.apache.el.parser.AstValueクラスでそれを見つけることができます。

public void setValue(EvaluationContext ctx, Object value) 
     throws ELException { 
    Target t = getTarget(ctx); 
    ctx.setPropertyResolved(false); 
    ELResolver resolver = ctx.getELResolver(); 

    // coerce to the expected type 
    Class<?> targetClass = resolver.getType(ctx, t.base, t.property); 
    if (COERCE_TO_ZERO == true 
      || !isAssignable(value, targetClass)) { 
     resolver.setValue(ctx, t.base, t.property, 
       ELSupport.coerceToType(value, targetClass)); 
    } else { 
     resolver.setValue(ctx, t.base, t.property, value); 
    } 
    if (!ctx.isPropertyResolved()) { 
     throw new PropertyNotFoundException(MessageFactory.get(
       "error.resolver.unhandled", t.base, t.property));    
    } 
} 

あなたは(-Dorg.apache.el.parser.COERCE_TO_ZERO = false)をfalseにCOERCE_TO_ZEROを設定することができます。

または使用する他のELのimpl:

<dependency> 
     <groupId>org.glassfish.web</groupId> 
     <artifactId>el-impl</artifactId> 
     <version>2.2</version>  
    </dependency> 

と設定コンテキストのparam:

servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl"); 

EL-API側でした。

その他の側はJSFです。JSF用にこのコンテキスト・パラメータを設定する必要があります。

servletContext.setInitParameter("javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", "true"); 

私の英語のために申し訳ありません!

-1

私は以下を試してみました。 web.xmlにこのエントリを追加する必要があります

<context-param> 
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> 
    <param-value>true</param-value> 
</context-param> 
関連する問題