Grails 3.2.4拒绝保存域实例:java.lang.IllegalArgumentException:对象不是声明类的实例
我正在从Grails2.4.4升级到Grails3.2.4 我已经设置了一些工厂来帮助我进行测试,角色工厂运行良好,在创建用户之前运行。然后我有以下代码:Grails 3.2.4拒绝保存域实例:java.lang.IllegalArgumentException:对象不是声明类的实例,java,grails,grails3,Java,Grails,Grails3,我正在从Grails2.4.4升级到Grails3.2.4 我已经设置了一些工厂来帮助我进行测试,角色工厂运行良好,在创建用户之前运行。然后我有以下代码: println "create user." def testUser = new User(username: 'admin@mail.com', firstName: "admin", lastName: "admin", email: "email@mail.com") println "
println "create user."
def testUser = new User(username: 'admin@mail.com', firstName: "admin", lastName: "admin", email: "email@mail.com")
println "User. :: " + testUser
println "User class. :: " + testUser.getClass().toString()
println("User Errors: " + testUser.errors)
testUser.save()
println "create user2."
def testUser2 = new User(username: 'trade@mail.com', email: 'trade@mail.com', firstName: "trade", lastName: "trade").save()
其中输出为:
create user
User. :: Person: admin@mail.com
User class. :: class UserManage.User
User Errors: grails.validation.ValidationErrors: 0 errors
2017-01-10 10:21:18.400 ERROR --- [ main] o.s.boot.SpringApplication : Application startup failed
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:62)
at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1245)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1217)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1125)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:812)
at org.grails.validation.ConstrainedPropertyBuilder.doInvokeMethod(ConstrainedPropertyBuilder.java:74)
at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:67)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:446)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:369)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at UserManage.User$__clinit__closure2.doCall(User.groovy:79)
at UserManage.User$__clinit__closure2.doCall(User.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
at groovy.lang.Closure.call(Closure.java:414)
at UserManage.User$__clinit__closure2.call(User.groovy)
at groovy.lang.Closure.call(Closure.java:408)
at UserManage.User$__clinit__closure2.call(User.groovy)
at org.grails.validation.DefaultConstraintEvaluator.evaluateConstraintsMap(DefaultConstraintEvaluator.java:240)
at org.grails.validation.DefaultConstraintEvaluator.evaluateConstraints(DefaultConstraintEvaluator.java:132)
at org.grails.validation.DefaultConstraintEvaluator.evaluateConstraints(DefaultConstraintEvaluator.java:119)
at org.grails.validation.DefaultConstraintEvaluator.evaluate(DefaultConstraintEvaluator.java:108)
at org.grails.core.DefaultGrailsDomainClass.initializeConstraints(DefaultGrailsDomainClass.java:755)
at org.grails.core.DefaultGrailsDomainClass.getConstrainedProperties(DefaultGrailsDomainClass.java:746)
at org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:76)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:122)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:116)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:98)
at org.grails.datastore.gorm.GormEntity$Trait$Helper$save$5.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at UserManage.User.save(User.groovy)
at UserManage.User.save(User.groovy)
at org.grails.datastore.gorm.GormEntity$save$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at groovy.Factories.UserFactory.Build(UserFactory.groovy:18)
at groovy.Factories.UserFactory$Build.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at agripedia.BootStrap$_closure1.doCall(BootStrap.groovy:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1089)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:408)
at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:516)
at grails.util.Environment.executeForEnvironment(Environment.java:509)
at grails.util.Environment.executeForCurrentEnvironment(Environment.java:485)
at org.grails.web.servlet.boostrap.DefaultGrailsBootstrapClass.callInit(DefaultGrailsBootstrapClass.java:62)
at org.grails.web.servlet.context.GrailsConfigUtils.executeGrailsBootstraps(GrailsConfigUtils.java:65)
at org.grails.plugins.web.servlet.context.BootStrapClassRunner.onStartup(BootStrapClassRunner.groovy:53)
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:256)
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at grails.boot.GrailsApp.run(GrailsApp.groovy:83)
at grails.boot.GrailsApp.run(GrailsApp.groovy:387)
at grails.boot.GrailsApp.run(GrailsApp.groovy:374)
at grails.boot.GrailsApp$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at agripedia.Application.main(Application.groovy:8)
save方法失败,这不是由于验证错误造成的
我的类结构是作为抽象类的APEntity,用户类继承自APEntity类。这段代码在Grails2.4.4中运行良好
如果您能给我一些建议,我将不胜感激 正在构造的类实例是
User
,但看到的类型是UserManage.User
at UserManage.User.save(User.groovy)
根据我的经验,Grails3比Grails2更能保证类型安全,而且对歧义的容忍度也更低。显式:
User a=new User()
正在构造的类实例是User
,但看到的类型是UserManage.User
at UserManage.User.save(User.groovy)
根据我的经验,Grails3比Grails2更能保证类型安全,而且对歧义的容忍度也更低。明确一点:
User a=new User()
事实证明验证是问题所在
在确保类型正确后,我禁用了所有约束。一旦约束被关闭,验证问题就变得明显了。在我的情况下,在Grails2中,我只需为未指定的日期输入一个空值。在Grails3中,这似乎是不允许的,因此我给了它一个默认值,验证问题得到了解决 结果证明验证是个问题
在确保类型正确后,我禁用了所有约束。一旦约束被关闭,验证问题就变得明显了。在我的情况下,在Grails2中,我只需为未指定的日期输入一个空值。在Grails3中,这似乎是不允许的,因此我给了它一个默认值,验证问题得到了解决 我只是想补充一下我对这个话题的注释,因为这篇文章让我把很多注意力放在了导致这个问题的错误方面,希望能节省其他人花时间去发现一些似乎定义不正确的东西
为未指定的日期输入空值
这完全不是真的
我花了很长时间试图跟踪问题是在3.2.8下的一个虚拟站点上创建的,并试图重新创建具有null true的hasMany和实际对象。如果是这样的话,那么就需要做很多额外的工作来填充不需要的空值,最终用不需要的东西填充数据库,并破坏代码的其他逻辑
就我所知,这一问题在grails 3.2中是由两个方面引起的:
这是当域类对象
String aUser
static constraints = {
aUser(nullable:true)
}
上述问题已在3.2.X的更高版本中修复
最近出现了一个新问题,域对象有_下划线
String _user
static constraints = {
_user(nullable:true)
}
这似乎是在修复,并有望在3.9修复
这意味着如果您有
\u对象
,可以安全地说它可能会在3.2.X>-<3.2.8(在3.1.10中工作)
下损坏 我只是想补充一下我对这个话题的注释,因为这篇文章让我把很多注意力放在了导致这个问题的错误方面,希望能节省其他人花时间去发现一些似乎定义不正确的东西
为未指定的日期输入空值
这完全不是真的
我花了很长时间试图跟踪问题是在3.2.8下的一个虚拟站点上创建的,并试图重新创建具有null true的hasMany和实际对象。如果是这样的话,那么就需要做很多额外的工作来填充不需要的空值,最终用不需要的东西填充数据库,并破坏代码的其他逻辑
就我所知,这一问题在grails 3.2中是由两个方面引起的:
这是当域类对象
String aUser
static constraints = {
aUser(nullable:true)
}
上述问题已在3.2.X的更高版本中修复
最近出现了一个新问题,域对象有_下划线
String _user
static constraints = {
_user(nullable:true)
}
这似乎是在修复,并有望在3.9修复
这意味着如果您有
\u对象
,可以安全地说它可能会在3.2.X>-<3.2.8(在3.1.10中工作)
下损坏 似乎与一个合同有关。您的超类中有自定义验证吗?验证是问题所在,我禁用了所有约束,验证问题变得明显。一旦我解决了这个问题,我们又可以继续了。似乎和一个矛盾有关。您的超类中有自定义验证吗?验证是问题所在,我禁用了所有约束,验证问题变得明显。一旦我解决了这个问题,我们就可以继续了。你是对的,Grails3对模棱两可的理解要小得多,但这是一件好事。这个问题原来是一个验证问题,而不是类型问题,但在我转到其他计划之前,我确实测试了您的建议。谢谢你的帮助。@AbrahamVanderLinde我完全同意!你是对的,Grails3对模棱两可的理解要小得多,但这是一件好事。这个问题原来是一个验证问题,而不是类型问题,但在我转到其他计划之前,我确实测试了您的建议。谢谢你的帮助。@AbrahamVanderLinde我完全同意!