grails - 检查instanceOf之后的ClassCastException

标签 grails groovy classcastexception

我有grails(3.2.11版)应用程序(其中包括groovy-2.4.11.jar)。
和下面的代码

 @CompileStatic
def removeAllErrors(DomainClass domainInstance) {
    newAssociationOperationRunnerBuilder(domainInstance)
    .setSkipChain({DomainObjectDetails<DomainObjectDataSingle> domainObjectDetails ->
        skipValidation(domainObjectDetails.currentDomain.domainObject, domainObjectDetails.associationProp?.name)})
    .build().run({DomainObjectDetails<DomainObjectDataSingle> domainObjectDetails ->
        DomainClass domain = domainObjectDetails.currentDomain.domainObject
        if (domain instanceof GormValidateable) {
            ((GormValidateable)domain).clearErrors()
        }
        if(domain instanceof WarningsHolder) {
            WarningsHolder warningsHolder = domain as WarningsHolder //<--- line 120
            Warnings warnings = warningsHolder.getWarnings()
            warnings.clearWarnings(false, true)
        }
    })
}

我正在追随异常
2018-06-14 10:16:41,647 ERROR StackTrace - Full Stack Trace:
java.lang.IllegalArgumentException: java.lang.ClassCastException@3f6e3869
    at sun.reflect.GeneratedMethodAccessor5958.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1125)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:925)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:908)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:168)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.asType(ScriptBytecodeAdapter.java:591)
    at com.webbfontaine.grails.plugins.validation.rules.DocVerificationService$_removeAllErrors_closure5.doCall(DocVerificationService.groovy:120)

知道是什么原因吗?
请注意,我那里也有@CompileStatic。

================================================== =======================
此代码的先前版本没有@CompileStatic
 def removeAllErrors(def domainInstance) {
    newAssociationOperationRunnerBuilder(domainInstance)
    .setSkipChain({DomainObjectDetails<DomainObjectDataSingle> domainObjectDetails ->
        skipValidation(domainObjectDetails.currentDomain.domainObject, domainObjectDetails.associationProp?.name)})
    .build().run({DomainObjectDetails<DomainObjectDataSingle> domainObjectDetails ->
        domainObjectDetails.currentDomain.domainObject.clearErrors()
        if(domainObjectDetails.currentDomain.domainObject instanceof WarningsHolder) {
            Warnings warnings = domainObjectDetails.currentDomain.domainObject.getWarnings()
            warnings.clearWarnings(false, true)
        }
    })
}

我得到这个异常(exception)
com.webbfontaine.sw.sad.ci.Item cannot be cast to com.webbfontaine.sw.sad.ci.Item_$$_jvst840_3. Stacktrace follows: java.lang.ClassCastException: com.webbfontaine.sw.sad.ci.Item cannot be cast to com.webbfontaine.sw.sad.ci.Item_$$_jvst840_3
at com.webbfontaine.grails.plugins.validation.rules.DocVerificationService$_removeAllErrors_closure5.doCall(DocVerificationService.groovy:111)

最佳答案

您根本不应该将instanceof与代理一起使用,因为这会导致不可预测的结果。

如果要检查对象的类,可以使用isAssignableFrom():

if ( GormValidateable.isAssignableFrom( domain.getClass() ) ) {...}

isCase() / switch:
switch( domain ){
  case GormValidateable: doStuff(); break
  case WarningsHolder: doOtherSTuff(); break
}

关于grails - 检查instanceOf之后的ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50855921/

相关文章:

java - 重载 Grails 静态 'mapping' 属性来固定数据库对象是否违反了 DRY?

grails - 自定义Grails统计信息

url - Grails 2.3.x : get the value of URL parameters

javascript - 使用 dojo 处理 grails ajax 请求

grails - 减少 Grails 项目构建时间的常用技术

groovy - Spock 验证模拟引发的异常以及模拟交互

java - 关于匿名类的 ClassCastException (java)

spring - Grails 3.0.9 : Spock integration tests' @Rollback annotation is not working

java - ClassCastException: org.apache.log4j.Logger 无法转换为 org.owasp.esapi.Logger

java.lang.String 无法转换为 [Ljava.lang.String;