0

我不是 100% 清楚我的问题来自哪里。当我从 grails 2.2.3 升级到 2.3.5 时,问题就开始了。我知道默认情况下(至少,可能有一些配置更改)现在几乎所有内容都默认编码为 HTML,但我也知道双编码已被处理,我认为这与双编码无关。

在我的代码库中,许多变量都是显式编码的AsHTML()。在 grails 升级之后,这是抛出 NullPointerException。

我的跟踪从一个简单的 .gsp 开始,带有域对象的标准显示:

${myDomain.encodeAsHTML()}

如果我删除 encodeAsHTML(),它可以工作(但由于我没有添加 Config 位来编码所有内容,它不会编码)。

堆栈跟踪的下一步指向我

Caused by: java.lang.NullPointerException: Cannot get property 'class' on null object
at myPackage.MyDomain$$EOUvovjw.equals(MyDomain.groovy:68)

这指向我的 equals() 方法。

我的第一个困惑是“为什么'encodeAsHTML()' 在我的对象上调用equals() 方法并将其与空对象进行比较?”

我的第二个(可能不相关,但值得一提)来自检查 equals() 方法本身的值:

boolean equals(o)
  {
    log.info("Comparing ${this} to ${o}, o is null? ${o == null}")
    if(this.is(o)) return true
    if(getClass() != o.class) return false    <--- NPE happens here
    ...more stuff...

日志输出显示:myPackage.MyDomain Comparing TheValue to null, o is null? 错误的

需要注意的是,当我检查 ${!o} 而不是 ${o == null} 时,它会打印“true”,但我很困惑 (o == null) 是 false,但我在 o.class 上得到了 NPE

可以更新我的所有域类 .equals() 方法来检查 (!o) 并返回 false,但我不认为这是正确的解决方案。

我的许多域对象都用于更改持久性上下文,这首先导致了覆盖 equals() 和 hashCode()。删除这些是不可行的。

4

1 回答 1

2

我通常使用

if (!(o instanceof MyDomain)) return false

这涵盖了 null 因为 null 不是任何事物的实例,并且涵盖了您正在比较不兼容类的情况。

为了让自己了解为什么会调用它,请添加

new Exception('wahoo!!!').printStackTrace()

在方法的顶部。这会将堆栈跟踪转储到控制台,显示导致那里的调用堆栈。

于 2014-02-04T21:47:25.163 回答