在将vom grails 2.1.4升级到2.3.11之后,我在某些域类中遇到了一种非常奇怪的行为。
Domain Objects我说的是使用继承,还有嵌入的属性。 这是我们正在使用的结构的简单概述
abstract class A {
String normalProperty
ComplexType embeddedProperty
static embedded = [ 'embeddedProperty' ]
}
class B extends A {
String someMoreProperties
static hasMany = [ cs: C ]
}
class C extends A {
String evenMoreProperties
static belongsTo = [ b: B ]
}
我可以保存B的实例而不会出错。 当我尝试创建一个C对象并将其添加到B中的列表并保存B时,我将收到以下错误:
Caused by: java.lang.NullPointerException
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.setupErrorsProperty(AbstractDynamicPersistentMethod.java:100)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractSavePersistentMethod.doInvokeInternal(AbstractSavePersistentMethod.java:156)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.invoke(AbstractDynamicPersistentMethod.java:63)
at org.codehaus.groovy.grails.orm.hibernate.HibernateGormInstanceApi.save(HibernateGormInstanceApi.groovy:196)
我调查了这个问题,发现验证不再有效。
如果我拨打b.validate()
或c.validate()
b.errors
,c.errors
仍然为空。
这导致保存时出现空指针异常。
奇怪的是,当对象中存在实际验证错误时,会出现错误Object,在验证通过时它仅为null。
通常,当您验证实体时,errors字段将具有grails.validation.ValidationError
Object的值。但是对于我的B和C对象,如果没有错误,错误字段将为null;如果存在验证错误,则错误字段将为org.springframework.validation.BeanPropertyBindingResult
。
非常感谢任何帮助或指示。