簡體   English   中英

Grails 2.5.5在具有equals方法的域類上使用'as JSON'時出錯

[英]Grails 2.5.5 error with 'as JSON' on a domain class that has an equals method

當我嘗試從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)
   }
   ...
}

這是例外:(錯誤發生在.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()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM