当我从Glassfish 3升级到4时,为什么我的JSP中会出现NullPointerExceptions?

时间:2014-03-11 17:20:24

标签: java jsp glassfish el glassfish-4

我从Glassfish 3升级到4,现在我的JSP正在抛出NPE。我没有更改任何代码,因此它必须与Glassfish有所不同。过去看起来像这样的JSP代码:

<c:when test="${invoke}">

现在给我一个NPE,除非我把它更改为:

<c:when test="${not empty invoke && invoke}">

我想知道为什么这种改变是必要的。有人能告诉我是什么造成的吗?为什么之前曾经工作过,不再有效?

2 个答案:

答案 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。