【问题标题】:Why am I getting NullPointerExceptions in my JSPs when I upgrade from Glassfish 3 to 4?当我从 Glassfish 3 升级到 4 时,为什么我的 JSP 中会出现 NullPointerExceptions?
【发布时间】:2014-03-11 17:20:23
【问题描述】:

我从 Glassfish 3 升级到 4,现在我的 JSP 正在抛出 NPE。我没有更改任何代码,所以它一定是 Glassfish 的不同之处。过去看起来像这样的 JSP 代码:

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

现在给我一个 NPE,除非我把它改成这样:

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

我想知道为什么这个改变是必要的。有人能告诉我这是什么原因造成的吗?为什么以前能用,现在不能用了?

【问题讨论】:

  • 有趣...你有向用户邮件列表/开发者列表报告吗?
  • @fge 不,我可以调查一下

标签: java jsp glassfish el glassfish-4


【解决方案1】:

表达式语言 3 显然是 JEE7 的一部分,因此您可以查看 specification。经过一番搜索,我找到了this answer,这表明与 2.2 相比,EL 3.0 更改了其默认行为。如果您可以更改默认强制行为以匹配以前的行为,那么您的问题就会消失。我不确定如何在 Glassfish 中执行此操作。否则,您可能会考虑切换到 boolean 原语而不是 Boolean 对象。

nulls 到非原始类型的默认强制转换(String 除外)返回 nulls。例如,null 强制转换为 Boolean 现在返回 null,而 null 强制转换为 boolean 返回false。

此外,当抱怨NPEs 时,几乎总是需要提供堆栈跟踪的相关部分。知道哪个类和方法引发了异常是相当重要的。

【讨论】:

  • 行号是编译 JSP 文件中的行。你认为这对你还有帮助吗?
  • 那一点信息有帮助,是的。这将涉及 JSP 编译器,不一定是 EL 实现。除非有嵌套异常,否则这就是我需要的。甚至生成代码的堆栈跟踪也能讲述一个故事。
【解决方案2】:

对于 Glassfish 4 在那种(想要的)EL 布尔评估中抛出 NPE,我有同样令人讨厌的烦恼:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 2015-11-23
    • 2019-10-08
    • 1970-01-01
    • 2021-11-17
    • 2018-12-27
    • 2019-10-04
    • 2019-03-10
    相关资源
    最近更新 更多