我从Glassfish 3升级到4,现在我的JSP正在抛出NPE。我没有更改任何代码,因此它必须与Glassfish有所不同。过去看起来像这样的JSP代码:
<c:when test="${invoke}">
现在给我一个NPE,除非我把它更改为:
<c:when test="${not empty invoke && invoke}">
我想知道为什么这种改变是必要的。有人能告诉我是什么造成的吗?为什么之前曾经工作过,不再有效?
答案 0 :(得分:1)
表达式语言3显然是JEE7的一部分,因此您可以查看specification。经过一番搜索后,我找到了this answer,这表明EL 3.0与2.2相比改变了默认行为。如果您可以更改默认的强制行为以匹配以前的行为,那么您的问题就会消失。我不知道如何在Glassfish中这样做。否则,您可能会考虑切换到boolean
原语而不是Boolean
个对象。
null
对非基本类型(String
除外)的默认强制返回null
s。例如,null
强制为Boolean
现在返回null
,而null
强制boolean
返回false
。
此外,在抱怨NPE
时,实际上总是需要提供堆栈跟踪的相关部分。知道哪个类和方法抛出异常是非常重要的。
答案 1 :(得分:1)
我对Glassfish 4投掷NPE进行了那种(想要的)EL布尔评估的同样令人讨厌的烦恼:
<c:if test="${couldNotExistVar}">
couldNotExistVar
的使用方案:
JSP + JSTL + EL示例:
<c:if test="${ obj.someExpensiveCalculation }">
<c:set var="couldNotExistVar" value="true" scope="request" />
</c:if>
作为解决方案,我发现最好添加第一行:
<c:set var="imSureExistsVar" value="false" scope="request" />
<c:if test="${ obj.someExpensiveCalculation }">
<c:set var="imSureExistsVar" value="true" scope="request" />
</c:if>
<强>缺点强>:
请注意 如果使用不同的(甚至使用相同的Java EE版本)应用服务器,NPE只能在开发环境之外被检测到回应为Glassfish 4。