我们正在尝试将主要由 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,因此至少在短期内将它们全部修复是不切实际的。