grails - 在具有equals方法的域类上, 'as JSON'出现Grails 2.5.5错误

标签 grails groovy grails-domain-class

当我尝试从springSecurityService获取当前登录的用户并将其呈现为JSON时,我刚遇到一个错误。

def user = springSecurityService.getCurrentUser()
println user as JSON // EXCEPTION!

用户是一个域类,并且具有equals方法,发生以下错误是因为“as JSON”似乎正在调用equals方法(我不明白为什么)。

用户看起来像这样:
class User implements Serializable {
   ...
   String username
   String password
   String email
   ...

   @Override
   boolean equals(other)
   {
      is(other) || (other.instanceOf(User) && other.username == username)
   }
   ...
}

这是异常(exception):(错误在.instanceOf(User)上)
2016-10-11 05:40:24,706 [http-bio-8090-exec-1] ERROR errors.GrailsExceptionResolver  - MissingMethodException occurred when processing request: [POST] /ehr/query/save

No signature of method: org.codehaus.groovy.grails.web.json.JSONObject$Null.instanceOf() is applicable for argument types: (java.lang.Class) values: [class com.cabolabs.security.User]. Stacktrace follows:

Message: No signature of method: org.codehaus.groovy.grails.web.json.JSONObject$Null.instanceOf() is applicable for argument types: (java.lang.Class) values: [class com.cabolabs.security.User]

    Line | Method
->>   45 | equals    in com.cabolabs.security.User
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|    176 | value     in grails.converters.JSON
|    134 | render .  in     ''
|    250 | save      in com.cabolabs.ehrserver.query.QueryController
|    198 | doFilter  in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter  in grails.plugin.cache.web.filter.AbstractFilter
|     53 | doFilter  in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|     62 | doFilter  in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run . . . in java.lang.Thread

有人在尝试相同吗?
这是预期的行为还是错误?

最佳答案

尽量不要自己提供equals()实现,而应使用Groovy提供的 @EqualsAndHashCode 批注。看看是否可行。

要么

像这样事先检查instanceOf()的可用性

(obj.respondsTo('instanceOf') && obj.instanceOf(User))

使用 respondsTo() 方法。

关于grails - 在具有equals方法的域类上, 'as JSON'出现Grails 2.5.5错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971346/

相关文章:

web-services - 使用WSClient调用外部SOAP Web服务时出错

java - 在 tomcat 上部署 grails 应用程序时创建名称为 'transactionManagerPostProcessor' 的 bean 时出错

hibernate - 尝试从 shell 使用 grails 域类

http - 如何使用 Groovy 脚本从 Http 请求获得唯一成功(200 ok)响应

mysql - 如何在grails中保存超过2列的多个子值

hibernate - 问题更新 Grails 域类

java - 在 grails 的引导带中应用程序启动时加载资源包

groovy - 如何在groovy脚本中将数组排序为3个元素的组

grails - 忽略Groovy HTTPBuilder中的cookie

grails - 在选项卡中,我有两个域