当我尝试从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
有人在试验吗? 这是预期的行为还是错误?
答案 0 :(得分:0)
尽量不要自己执行equals()
,并使用Groovy提供的这个@EqualsAndHashCode
注释。看看是否有效。
或者
事先检查instanceOf()
可用性,就像这样
(obj.respondsTo('instanceOf') && obj.instanceOf(User))
使用respondsTo()
方法。