Grails 3.2.4拒绝保存域实例:java.lang.IllegalArgumentException:对象不是声明类的实例

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 "

我正在从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 "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我完全同意!