Validation Grails4没有正确验证
我正在将一个相当大的Grails2.5应用程序升级到Grails4.0.3。在我的域结构中,我有一些与这里的示例类似的东西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 = {
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()
模拟约束的方法。我认为这性能较差,但它满足了我们的需要。希望在将来的版本中修复这一问题,我们可以将其删除。