grails - Grails 2.3 domain.encodeAsHTML()从domain.equals()引发空指针异常

标签 grails grails-2.3

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

在我的整个代码库中,许多变量都被明确地编码为HTML()。在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为null?假

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

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

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

最佳答案

我通常用

if (!(o instanceof MyDomain)) return false

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

为了使自己对为什么调用此调用有一些了解,请添加
new Exception('wahoo!!!').printStackTrace()

在方法的顶部。这会将堆栈跟踪信息转储到控制台,显示导致该位置的调用堆栈。

关于grails - Grails 2.3 domain.encodeAsHTML()从domain.equals()引发空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21562673/

相关文章:

maven - 导入 Maven 依赖项(示例 Jsoup.jar)

grails - 无法设置只读属性:params

java - 从消息头 Grails 中提取消息 ID

hibernate - "Where query"在生产中创建错误的 SQL

grails - 用neo4j更新夹具刷新错误

java - Grails 2.3.0 自动重新加载不起作用

Grails:Spring Security CAS 在 2.2.3 中工作,但在 2.3.0 中不起作用

grails - Sonar 5.1.1 与 Groovy Plugin 1.1.1 项目始终报告 0.0 天的技术债务

Grails 中的 Spring Oauth2 提供程序 - 依赖项

grails - 使用 facebook oauth2.0 的 Grails 2.3.8 应用程序中出现异常