javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL больше не работает, так как 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>
Не работает с последней Mojarra 2.2.5 на Glassfish 4 и Wildfly 8 Final.
Я видел несколько сообщений об ошибках, говорит Манфрид Рим,
Было установлено, что это проблема EL, и реализация EL была исправлена, чтобы исправить это.
В версиях исправлений написано 2.2.5, и это также указано в примечаниях к выпуску 2.2.5. Я что-то упустил?
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;
}
}
Я видел несколько сообщений об ошибках, говорит Манфрид Рим,
Было установлено, что это проблема EL, и реализация EL была исправлена, чтобы исправить это.
В версиях исправлений написано 2.2.5, и это также указано в примечаниях к выпуску 2.2.5. Я что-то упустил?
Фактическое исправление в EL, а не в JSF. Версия Mojarra, упомянутая в отчете о проблеме, была просто "случайно" последней версией Mojarra на тот момент. Смотрите также Пустое Безумие Струны.
По сути, для решения этой проблемы вам необходимо обновить реализацию EL (или просто весь сервер, поскольку он фактически предоставляет EL из коробки). В случае Oracle/Sun EL исправление находится в версии 3.0.1 b05, которая доступна с 7 июля 2014 года (просто выберите самую новую). Вы можете просто бросить банку в /WEB-INF/lib
и при необходимости добавьте приведенную ниже конфигурацию в web.xml
в случае, если ваш сервер поставляется с реализацией EL, отличной от Oracle/Sun 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, используйте <param-name>
из org.apache.myfaces.EXPRESSION_FACTORY
,
Что касается обновления сервера, версия EL с исправлением присутствует как минимум в GlassFish 4.1 и WildFly 8.2.
Пример кода проверки состояния объекта неверен. На этапе обновления модели объект передается в ноль. После исправления кода ниже, мой пользовательский 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. См. Обходной путь для некорректного INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL в Mojarra JSF 2.1
Мы протестировали все Oracle EL 2.2.2, 3.0.0, 3.0.1-b0X[1-8] и с Apache Jasper EL 3.0 в Tomcat 7.0.xx или Tomcat 8.0.30, используя или не настраивая оболочку ELResolver с фиксированными гранями ELResolver @. -config.xml level.
Результат тот же. String MethodExpression null интерпретируется как EMPTY String ""
Вызов из EL следующих методов с t=null;
Случай 1
public final void checkObject(Object t)
...
#{myBean.checkObject(null)} -> Receive null (OK)
Дело 2
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)
Дело 4
public final void checkBigDecimal(BigDecimal t)
...
#{myBean.checkBigDecimal(null)} -> Receive null (OK)