JSF 2.2 интерпретирует представленные значения пустой строки как нуль, не работающий

Я перешел с Java EE 6 на Java EE 7, и теперь с JSF 2.2 параметр контекста INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL, похоже, не работает. В JSF 2.1 я установил для него значение «true», и он отлично работает, но теперь я всегда получаю пустые строки.

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

Кто-нибудь может что-нибудь сказать об этом?


person onsm7    schedule 24.10.2013    source источник
comment
Возможно ошибка в реализации. Можете ли вы отладить среду, чтобы убедиться, что это ошибка в исходниках модхарры?   -  person Harsha R    schedule 26.10.2013
comment


Ответы (6)


То же самое происходит и со Glassfish 4 с последним Mojarra-2.2.5, а также с Wildfly 8 Final. . . Я видел несколько отчетов об ошибках по этому поводу, Манфрид Рим говорит: «Было установлено, что это проблема EL, и реализация EL была исправлена, чтобы исправить это», но не уверен, означает ли это, что обновление Mojarra исправляет это, потому что это не в Glassfish 4. Тоже обновил эл, и то тоже не помогло.

person Sphynx    schedule 19.02.2014

К сожалению, похоже, в Glassfish 4 есть ошибка.

Видеть:

INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL вообще не работает

и:

Пустая строка как Null не действует в версии 2.2.0

person t3chris    schedule 03.12.2013

Реализация Apache el делает пустую строку (или значение 0 int). Вы можете найти его в классе org.apache.el.parser.AstValue:

public void setValue(EvaluationContext ctx, Object value)
        throws ELException {
    Target t = getTarget(ctx);
    ctx.setPropertyResolved(false);
    ELResolver resolver = ctx.getELResolver();

    // coerce to the expected type
    Class<?> targetClass = resolver.getType(ctx, t.base, t.property);
    if (COERCE_TO_ZERO == true
            || !isAssignable(value, targetClass)) {
        resolver.setValue(ctx, t.base, t.property,
                ELSupport.coerceToType(value, targetClass));
    } else {
        resolver.setValue(ctx, t.base, t.property, value);
    }
    if (!ctx.isPropertyResolved()) {
        throw new PropertyNotFoundException(MessageFactory.get(
                "error.resolver.unhandled", t.base, t.property));            
    }
}

Вы можете установить для COERCE_TO_ZERO значение false (-Dorg.apache.el.parser.COERCE_TO_ZERO=false).

Или используйте другой el impl:

    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>      
    </dependency>

И установите контекст-параметр:

    servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl");

Это была сторона Эль-Апи.

Другая сторона - JSF. Вы должны установить этот параметр контекста для JSF:

servletContext.setInitParameter("javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", "true");

Извините за мой английский!

person cirippp    schedule 27.03.2015

Теперь все еще более запутанно. Я использую JSF 2.2.8-SNAPSHOT, и хотя значение интерпретируется как нулевое во время проверки бина JSF, фактический набор значений представляет собой пустую строку. Это означает, что другие компоненты, выполняющие проверку, например. Проверка длины ошибки JPA, поскольку значение String равно "".

Поскольку для этого, очевидно, требуется изменение спецификации, я не ожидал бы этого в ближайшее время. jira также содержит обходной путь, описанный в этом post.

Пс. Это может быть правильным поведением, как указано в документации. этот null передается в структуру проверки bean-компонента, но это совсем не интуитивно понятно.

person Ioannis Deligiannis    schedule 06.07.2014

В подобном случае мне помогло свойство JVM для сервера приложений. См. Обходной путь для ошибочного INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL в Mojarra JSF 2.1

person straville    schedule 23.02.2015

Я пробовал ниже и работал. нам нужно добавить эту запись в web.xml

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>
person Bhupal    schedule 30.10.2015