2017-01-10 8 views
1

Я модернизируюсь от Grails 2.4.4 до Grails 3.2.4.Grails 3.2.4 отказывается сохранять экземпляр домена: java.lang.IllegalArgumentException: объект не является экземпляром класса объявления

У меня есть несколько заводов, которые помогают мне в тестировании, фабрика ролей отлично работает, которая запускается до создания пользователей. Тогда у меня есть следующий код:

 println "create user." 
     def testUser = new User(username: '[email protected]', firstName: "admin", lastName: "admin", email: "[email protected]") 
     println "User. :: " + testUser 
     println "User class. :: " + testUser.getClass().toString() 
     println("User Errors: " + testUser.errors) 
     testUser.save() 
     println "create user2." 
     def testUser2 = new User(username: '[email protected]', email: '[email protected]', firstName: "trade", lastName: "trade").save() 

из которого выход:

create user 
User. :: Person: [email protected] 
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) 

спасбросков метод терпит неудачу, и это не из-за ошибки проверки.

Моя структура класса APEntity как абстрактный класс, а класс User наследуется от класса APEntity. Этот код отлично работает в Grails 2.4.4

Любые предложения, в которых я могу найти исправление ошибки, будут очень признательны.

+0

Кажется, что оно связано с каким-либо контрастом. Есть ли у вас какая-либо специальная проверка в вашем суперклассе? – bassmartin

+0

Валидация была проблемой, я отключил все ограничения, и проблема проверки стала очевидной. Как только я это исправил, мы смогли продолжить снова. – Abraham

ответ

0

Оказалось, что валидация была проблемой.

После того, как я убедился, что типы верны, я отключил все мои ограничения. Как только ограничения были отключены, проблема проверки стала очевидной. В моей ситуации это было то, что в Grails 2 я просто вводил бы нулевое значение для даты, которая не указана. В grails 3 кажется, что это недопустимо, поэтому я дал ему значение по умолчанию, и проблема проверки была исправлена.

0

Экземпляр класса строится в User, но тип видел это UserManage.User

at UserManage.User.save(User.groovy) 

В моем опыте Grails-гораздо более типобезопасный чем Grails 2 и менее снисходительная двусмысленность. Будьте ясны: User a = new User()

+0

Вы правы, что Grails 3 гораздо менее прощает за двусмысленность, но это хорошо. Проблема оказалась проблемой проверки, а не проблемой типа, но я проверил ваше предложение, прежде чем перешел к другим планам. Спасибо за помощь. – Abraham

+0

@AbrahamVanderLinde Я полностью согласен! – Anatoly

0

Просто чтобы добавить свои заметки по этой теме, так как это было сообщение, которое заставило меня сосредоточить внимание на неправильных аспектах, вызывающих проблему, в надежде спасти других, проводя время, пытаясь определить то, что не кажется правильно определено.

input a null value for a date that is not specified

Это не совсем верно.

Прошло много времени, пытаясь отследить, где проблема была создана в качестве фиктивного сайта в разделе 3.2.8, и попыталась воссоздать hasMany и фактические объекты с нулевым значением true. Если бы это было так, тогда было бы много дополнительной работы по заполнению нулей, где это не было необходимо и, в конечном счете, заполнять БД ненужными материалами и нарушать другие логики кода.

В любом случае, насколько я понимаю, эта проблема вызвана в Граалей 3,2 две вещи до сих пор:

https://github.com/grails/grails-core/issues/10428

Это было, когда объект класса домен был

String aUser 

static constraints = { 
aUser(nullable:true) 
} 

выше уже исправлена ​​в более поздних версиях 3.2.X

Новый выпуск хит недавно https://github.com/grails/grails-core/issues/10600, когда объект домена имеет _underscore

String _user 

static constraints = { 
_user(nullable:true) 
} 

Это, как представляется, в для фиксации и следует надеяться, фиксируется на 3,9

Значение, если у вас есть _objects будет безопасно сказать, что он, вероятно, сломается под 3.2.X > - < 3.2.8 (was working in 3.1.10).