Пустые поля ввода String, представленные как пустые строки против нуля - JSF 2.3 MyFaces - Tomcat (TomEE)/9.0.12 (8.0.0-M1)
Пустые поля ввода формы, связанные с бином. Тип String принимается как пустые строки (""), когда ожидаемое значение равно NULL.
Это старая проблема, которая, похоже, воссоздается с каждой версией Oracle EL, Apache EL или Tomcat.
@BalusC обращался к нему много раз. Empty String Madness, принудительное поведение 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");
}
}
Лица-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 ответ
Согласно статье "Пустое безумие струны", The EmptyToNullStringELResolver
и Oracle EL не нужно делать одновременно. Для Tomcat 8.0.16 или новее перечислено следующее:
JF: добавить
javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL=true
контекстный параметр
ER: зарегистрироватьсяEmptyToNullStringELResolver
Или, альтернативно, просто сделайте УП.
UE: выполнить миграцию / обновление до версии реализации Oracle EL 3.0.1-b05 или новее.
Обратите внимание на "альтернативное" слово. Таким образом, это нормально делать только одно или другое.
Что касается наблюдаемого NullPointerException
это происходит, когда ResourceHandler
необходимо передать поток, который может содержать выражения EL. По умолчанию это происходит только в ресурсах CSS, чтобы иметь возможность поддерживать Как ссылаться на ресурс изображения JSF как URL фонового изображения CSS. ValueExpressionFilterInputStream
представляет внутренний класс MyFaces, который используется для оценки выражений EL при чтении InputStream
, Тем не менее, он, по-видимому, имеет ошибку, из-за которой он не ожидает выражения EL, которые возвращают null
вместо конкретного объекта. Эта проблема, в свою очередь, на самом деле не связана с решениями для "Пустого струнного безумия". Это случилось бы, тем не менее. Вы должны по крайней мере отсканировать ваши собственные CSS-файлы на наличие EL-выражений, которые неверно возвращают null
и исправить их.