我有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/