![](/img/trans.png)
[英]using javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL causes viewParam to be null
[英]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.