簡體   English   中英

javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 自 Java EE 7 / EL 3.0 起不再工作

[英]javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL does not work anymore since Java EE 7 / EL 3.0

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

不適用於 glassfish 4 和 wildfly 8 Final 上的最新 Mojarra 2.2.5

曼弗里德·里姆( Manfried Riem) ,我已經看到多個關於此的錯誤報告,

已確定這是一個 EL 問題,並且已修復 EL 實現以解決此問題

修復版本說是 2.2.5,在 2.2.5 的發行說明中也有說明,我是不是遺漏了什么?

使用自定義解析器修復:

面孔-config.xml:

<application>
     <el-resolver>my.package.EmptyNullStringResolver</el-resolver>
</application>

EmptyNullStringResolver.java:

/**
 * @author pg
 */
public class EmptyNullStringResolver extends ELResolver {

    @Override
    public Class<?> getCommonPropertyType(ELContext context, Object base) {
        return String.class;
    }

    @Override
    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
        return null;
    }

    @Override
    public Class<?> getType(ELContext context, Object base, Object property) {
        return null;
    }

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        return null;
    }

    @Override
    public boolean isReadOnly(ELContext context, Object base, Object property) {
        return true;
    }

    @Override
    public void setValue(ELContext context, Object base, Object property, Object value) {
    }

    @Override
    public Object convertToType(ELContext context, Object obj, Class<?> targetType) {
        if (String.class.equals(targetType) && obj instanceof String && ((String) obj).trim().isEmpty()) {
            context.setPropertyResolved(true);
        }
        return null;
    }
}

曼弗里德·里姆( Manfried Riem) ,我已經看到多個關於此的錯誤報告,

已確定這是一個 EL 問題,並且已修復 EL 實現以解決此問題

修復版本說是 2.2.5,在 2.2.5 的發行說明中也有說明,我是不是遺漏了什么?

實際的修復是在 EL 中,而不是在 JSF 中。 問題報告中提到的 Mojarra 版本只是“偶然地”當時最新的 Mojarra 版本。 另請參閱空字符串瘋狂

基本上,要解決這個問題,您需要升級 EL 實現(或者只是升級整個服務器,因為它是實際提供開箱即用 EL 的服務器)。 對於 Oracle/Sun EL,該修復程序在3.0.1 b05 版本中,該版本自 2014 年 7 月 7 日起可用(只需選擇最新版本)。 您可以將 JAR 放在/WEB-INF/lib並在必要時將以下配置添加到web.xml ,以防您的服務器附帶與 Oracle/Sun EL 不同的 EL 實現,這也暴露了相同的錯誤:

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>   
</context-param>

或者您可以安裝替代 EL 實現,例如JUEL

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>de.odysseus.el.ExpressionFactoryImpl</param-value>   
</context-param>

如果您使用的是 MyFaces 而不是 Mojarra,請使用org.apache.myfaces.EXPRESSION_FACTORY <param-name>

至於升級服務器,至少在 GlassFish 4.1 和 WildFly 8.2 中存在帶有修復的 EL 版本。

示例代碼 obj 條件檢查是錯誤的。 在更新模型階段,obj 以空值傳遞。 更正下面的代碼后,我的自定義 ELResolver 工作。

 @Override
public Object convertToType(final ELContext context, final Object obj, final Class<?> targetType) {
    if (obj == null && String.class.equals(targetType)) {
        context.setPropertyResolved(true);
    }
    return null;
}

應用程序服務器有一個 JVM 參數對我有幫助。 請參閱解決 Mojarra JSF 2.1 中錯誤的 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL

我們在 Tomcat 7.0.xx 或 Tomcat 8.0.30 中測試了所有 Oracle EL 2.2.2、3.0.0、3.0.1-b0X[1-8] 和 Apache Jasper EL 3.0,使用或不使用帶有 ELResolver 固定 @faces 的自定義 ELResolver Wrapper -config.xml 級別。

結果是一樣的。 String MethodExpression null 被解釋為 EMPTY String ""

使用 t=null 從 EL 調用以下方法;

情況1

public final void checkObject(Object t) 
...
#{myBean.checkObject(null)} -> Receive null (OK)

案例二

public final void checkString(String t) 
...
#{myBean.checkString(null)} -> Receive EMPTY String "" (NOT OK)

案例3

public final void checkDouble(double t) 
...
#{myBean.checkDouble(null)} -> Receive 0.0 (OK)

案例四

public final void checkBigDecimal(BigDecimal t) 
...
#{myBean.checkBigDecimal(null)} -> Receive null (OK) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM