Пустые поля ввода String, представленные как пустые строки против нуля - JSF 2.3 MyFaces - Tomcat (TomEE) /9.0.12 (8.0.0-M1) - PullRequest
1 голос
/ 23 мая 2019

Пустые поля ввода формы, привязанные к бину. Строковый тип принимается как пустые строки (""), когда ожидаемое значение равно NULL.

Это старая проблема, которая, похоже, воссоздается при каждой версии Oracle ELили Apache EL или Tomcat.

@ BalusC обращался к нему много раз. Пустое безумие строки , Принудительное поведение Tomcat 8 (и 9), нулевые строки установлены неправильно, так как пустые строки - пара примеров.

Я попробовал все предыдущие обходные пути без успеха.

someform.xhtml

<h:form>
  <h:outputText value="Some Input: " />
  <p:inputText value="#{someBean.stringVariable}" />

  <p:commandButton id="search-button"
                    value="Search"
                    actionListener="#{someBean.doSearch}" />
</form>

SomeBean.java

private String stringVariable;
// Setter & Getter
public void doSearch()
{
    if(stringVariable == null)
    {
       System.out.println("Input is NULL");
    }
    else if(stringVariable.equals(""))
    {
       System.out.println("Input is EMPTY STRING");    
    }
}

Face-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">
        <application>
        <el-resolver>com.example.EmptyToNullStringELResolver</el-resolver>
    </application> 
    <application>
        <resource-handler>org.jepsar.primefaces.theme.jepsar.FontAwesomeResourceHandler</resource-handler>
        <resource-handler>org.omnifaces.resourcehandler.UnmappedResourceHandler</resource-handler>
    </application>  
    <application>
        <el-resolver>
           org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver
        </el-resolver>
    </application>
    <factory>
           <exception-handler-factory>
                 org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory
           </exception-handler-factory>
    </factory> 
 </faces-config>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
  </context-param> 
  <context-param>     
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>   
  </context-param>
</web-app>

Когда я использую пользовательский метод EmptyToNullStringELResolver, выдается NPE.

java.lang.NullPointerException
    at org.apache.myfaces.shared.resource.ValueExpressionFilterInputStream.read(ValueExpressionFilterInputStream.java:130)
    at java.io.InputStream.read(InputStream.java:179)
    at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:385)
    at org.omnifaces.util.Utils.stream(Utils.java:397)
    at org.omnifaces.resourcehandler.UnmappedResourceHandler.handleResourceRequest(UnmappedResourceHandler.java:176)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:196)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at ...

Удаление самого последнего EL JAR изOracle в WEB / lib, кажется, не имеет никакого эффекта.(javax.el-3.0.1-b11.jar)

Спасибо, Тед С

1 Ответ

3 голосов
/ 23 мая 2019

Согласно статье Пустое безумие , EmptyToNullStringELResolver и Oracle EL не нужно выполнять одновременно.Для Tomcat 8.0.16 или новее перечислено следующее:

JF : добавить javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL=true контекстный параметр.
ER : зарегистрировать EmptyToNullStringELResolver или, в качестве альтернативы, просто выполните UE .
UE : выполнить миграцию / обновление до версии реализации Oracle EL 3.0.1-b05 или новее.

Обратите внимание на «альтернативно» слово.Таким образом, можно делать только одно или другое.

Что касается наблюдаемого NullPointerException, то это происходит, когда ResourceHandler требуется потоковая передача ресурса, который может содержать выражения EL.По умолчанию это происходит только на ресурсах CSS, чтобы иметь возможность поддерживать Как ссылаться на ресурс изображения JSF в качестве URL фонового изображения CSS .ValueExpressionFilterInputStream представляет внутренний класс MyFaces, который используется для оценки выражений EL при чтении InputStream.Тем не менее, он, очевидно, имеет ошибку, из-за которой он не ожидает выражения EL, которые возвращают null вместо конкретного объекта.Эта проблема, в свою очередь, на самом деле не связана с решениями для «Пустого безумия».Это случилось бы, тем не менее.Вы должны по крайней мере отсканировать ваши собственные файлы CSS на наличие выражений EL, которые неправильно возвращают null и исправляют их.

...