0

我们正在尝试将主要由 JSP 构建的网站从 Websphere 迁移到 Jetty。我们在NullPointerException评估test属性中的 EL 代码时遇到问题:

<c:if test="${requestScope.domainSpecificName}">

问题是该domainSpecificName属性要么设置为 true,要么在请求中不存在。

在 Websphere 中,这一行被编译为

_jspx_th_c_if_0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${requestScope.domainSpecificName}", boolean.class, (PageContext)pageContext, _jspx_fnmap, false)).booleanValue());

(注意类是boolean,默认值是false。)

Jetty 中 JSP 的同一行编译为

_jspx_th_c_if_0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.evaluateExpression("${requestScope.domainSpecificName}", java.lang.Boolean.class, (PageContext)_jspx_page_context, null)).booleanValue());

这里我们有一个类Boolean和一个默认值null,如果属性不存在,它显然会抛出一个 NPE。

从文档中,听起来如果我们可以设置JexlBuilder.strict(false)它不会将null值视为错误。(虽然我不确定如何编译。)

有谁知道如何在 Jetty 中配置 JexlBuilder?

或者,如果我走错了路;有谁知道处理这个的正确方法?有数百个实例<c:if test="${...}">可能会引发 NPE,因此至少在短期内将它们全部修复是不切实际的。

4

1 回答 1

0

Jetty 中的 JSP 支持使用 Apache Jasper,后者使用 Apache EL,后者使用javax.el.

javax.el没有JexlBuilder样式类。

也许 Apache JSP 或 Apache EL 系统属性之一会对您有所帮助。

见:https ://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html

于 2019-09-16T20:41:33.527 回答