Обойти неисправный INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL в Mojarra JSF 2.1 - PullRequest
11 голосов
/ 10 июня 2011

Я знаю, что в 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, преобразователь получает значение NULL, а установщик входного текста по-прежнему получает "".

Когда для параметра 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 Ответ

21 голосов
/ 10 июня 2011

Это не характерно для Мохарры. Это специфично для 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 он отлично работает из коробки.

...