带有继承的Grails Domain Class无法在验证后设置错误

时间:2014-07-10 10:26:13

标签: validation grails inheritance gorm

在将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.errorsc.errors仍然为空。 这导致保存时出现空指针异常。 奇怪的是,当对象中存在实际验证错误时,会出现错误Object,在验证通过时它仅为null。

通常,当您验证实体时,errors字段将具有grails.validation.ValidationError Object的值。但是对于我的B和C对象,如果没有错误,错误字段将为null;如果存在验证错误,则错误字段将为org.springframework.validation.BeanPropertyBindingResult

非常感谢任何帮助或指示。

0 个答案:

没有答案