Обойти неисправный INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL в Mojarra JSF 2.1
Я знаю, что в JSF2 есть ряд постов о преобразовании пустой строки в ноль. Обычный рецепт - добавить следующее в web.xml.
<context-param>
<description>Does not appear to work</description>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Это просто не похоже на работу - вообще. Затем я создал собственный конвертер строк, чтобы проверить, будет ли он работать. Я явно добавил его как конвертер в мой inputText (иначе он не срабатывает, когда пусто).
Если для параметра INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL задано значение true, преобразователь получает нулевое значение, а установщик входного текста по-прежнему получает "".
Когда для INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL установлено значение false (или закомментировано), преобразователь получает "", а установщик входного текста получает "" (даже после того, как преобразователь возвращает ноль).
@FacesConverter(forClass=java.lang.String.class, value="emptyStringToNull")
public class StringConverter implements Converter, Serializable {
private static final long serialVersionUID = -1121162636180944948L;
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.trim().isEmpty()) {
return null;
}
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object object) {
if (object == null)
return null;
return object.toString();
}
}
Я попытался событие (безрезультатно) явно установить значение, представленное компонентом в getAsObject:
if (component instanceof EditableValueHolder)
((EditableValueHolder) component).setSubmittedValue(null);
Я использую JBoss6 (снимок 6.1 действительно) и JSF 2.1.1.
1 ответ
Это не характерно для Моджарры. Это специфично для Tomcat (JBoss использует Tomcat в качестве сервлет-контейнера). Добавьте следующий аргумент VM в параметры запуска.
-Dorg.apache.el.parser.COERCE_TO_ZERO=false
По моему опыту, этот на самом деле должен применяться только на Number
свойства (int, long и т. д.), однако, начиная с определенной поздней версии Tomcat 6.0.x (по крайней мере, после 6.0.20), он, похоже, не работает и для строк, и полагается на приведенный выше аргумент VM.
Например, на GlassFish 3.x он отлично работает из коробки.