Validation Grails4没有正确验证

Validation Grails4没有正确验证,validation,grails,gorm,Validation,Grails,Gorm,我正在将一个相当大的Grails2.5应用程序升级到Grails4.0.3。在我的域结构中,我有一些与这里的示例类似的东西 package com.test class Face { static hasOne = [mouth: Mouth] static constraints = { } } package com.test abstract class Mouth { Face face static constraints = {

我正在将一个相当大的Grails2.5应用程序升级到Grails4.0.3。在我的域结构中,我有一些与这里的示例类似的东西

package com.test

class Face {

    static hasOne = [mouth: Mouth]

    static constraints = {
    }
}

package com.test

abstract class Mouth {
    Face face

    static constraints = {
    }
}

package com.test

class BigMouth extends Mouth {
    Integer numberOfTeeth
    Boolean tonsilsRemoved

}
验证face对象时,我希望看到的行为是,它还应该验证mouth对象。所以我设置了一个测试控制器来测试它

package com.test

class TestController {

    def index() { 
        Face face = new Face()
        face.mouth = new BigMouth(
                face: face
        )

        // numberOfTeeth & tonsilsRemoved cannot be null, but are
        assert !face.validate()
        println 'no failure'
    }
}
和一个测试用例

package com.test

import grails.testing.gorm.DomainUnitTest
import spock.lang.Specification

class FaceSpec extends Specification implements DomainUnitTest<Face> {

    def setup() {
    }

    def cleanup() {
    }

    void "test hasOneValidation"() {
        when:
        domain.mouth = new BigMouth(numberOfTeeth: null)

        then:
        !domain.validate()
    }
}
package.com.test
导入grails.testing.gorm.DomainUnitTest
导入spock.lang.Specification
类FaceSpec扩展规范实现DomainUnitTest{
def设置(){
}
def cleanup(){
}
无效“测试hasOneValidation”(){
什么时候:
domain.mouth=新大嘴(NumberOfDeaths:null)
然后:
!domain.validate()
}
}
然而,我看到的行为是face是有效的,并且它没有传递assert语句。这在2.5中对我们有效。关于这个测试用例的另一个注意事项是,如果我将BigMouth属性移动到Mouth并使其成为一个具体的类,那么同一个测试将有一个face对象失败并通过assert语句

这是Grails4.0.3的预期行为吗?如果不是的话,我在这里是不是做错了什么


运行Grails4.0.3、Java11和Windows10时,这似乎是由Grails4中的错误引起的。域层次结构正在尝试对父对象应用子约束,但未能应用,因为父对象上不存在子对象的属性。

这似乎是由Grails 4中的错误导致的。域层次结构正在尝试对父对象应用子约束,但由于父对象上不存在子对象的属性,因此未能应用子约束。

您知道该错误的解决方法吗?实际上,我也遇到了唯一约束问题:-(取决于它对您的影响。在我们的例子中,它是基于子类中的另一个属性创建对象的唯一约束。我们删除了
约束
检查,并添加了
beforeinstert()
模拟约束的方法。我认为这性能较差,但它满足了我们的需要。希望在将来的版本中修复这一问题,我们可以将其删除。您知道该缺陷的解决方法吗?我实际上也遇到了唯一的约束问题:-(取决于它对您的影响。在我们的例子中,它是基于子类中的另一个属性创建对象时的唯一约束。我们删除了
约束
检查,并添加了
beforeeinsert()
模拟约束的方法。我认为这性能较差,但它满足了我们的需要。希望在将来的版本中修复这一问题,我们可以将其删除。