Grails 2.3 domain.encodeAsHTML()从domain.equals()抛出空指针异常

时间:2014-02-04 20:26:54

标签: grails grails-2.3

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

在我的代码库中,许多变量都被明确地编码为ASPML()。在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比较TheValue为null,o为空?假

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

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

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

1 个答案:

答案 0 :(得分:2)

我通常使用

if (!(o instanceof MyDomain)) return false

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

为了让自己能够了解调用它的原因,请添加

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

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