Grails 2.5.5错误与'作为JSON'在具有equals方法的域类上

时间:2016-10-11 06:10:59

标签: grails groovy grails-domain-class

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

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

用户是一个域类,并且有一个等于的方法,下面的错误发生是因为'作为JSON'似乎是在调用equals方法(我不明白为什么)。

用户看起来像这样:

class User implements Serializable {
   ...
   String username
   String password
   String email
   ...

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

这是例外:(错误在.instanceOf(用户)上)

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

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

1 个答案:

答案 0 :(得分:0)

尽量不要自己执行equals(),并使用Groovy提供的这个@EqualsAndHashCode注释。看看是否有效。

或者

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

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

使用respondsTo()方法。