0

我正在将一个大项目从 grails 2.5.4 迁移到 3.3.10。一切进展顺利,但我的域对象有一个市长问题。我用这种方式编写我的自定义验证器:

class Person {
  String name

  static constraints = {
      name: nullable: false, validator: validateName
  }
  static validateName = {
      // validation code
  }
}

Grails 抛出以下异常

 No such property: validatorTest for class: org.grails.orm.hibernate.cfg.HibernateMappingBuilder

在 grails 3.x 中,这种定义验证器的方式似乎被打破了。我知道文档说要使用这种方式:

name nullable: false, validator: { // code }

但在这种情况下要重写很多代码。

有没有办法使用定义验证器的旧方法?

谢谢

4

1 回答 1

2

请参阅https://github.com/jeffbrown/alejandroveraconstraints上的项目。

https://github.com/jeffbrown/alejandroveraconstraints/blob/master/grails-app/domain/alejandroveraconstraints/Person.groovy

// grails-app/domain/alejandroveraconstraints/Person.groovy
package alejandroveraconstraints

class Person {
    String name

    static constraints = {
        name nullable: false, validator: Person.validateName
    }

    static validateName = {
        it != 'Some Bad Name'
    }
}

https://github.com/jeffbrown/alejandroveraconstraints/blob/6701f61d61dbbde34f4925d1bf418448eee0a729/src/test/groovy/alejandroveraconstraints/PersonSpec.groovy

// src/test/groovy/alejandroveraconstraints/PersonSpec.groovy
package alejandroveraconstraints

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

class PersonSpec extends Specification implements DomainUnitTest<Person> {

    void "test validation"() {
        expect:
        !new Person(name: 'Some Bad Name').validate()
        new Person(name: 'Some Good Name').validate()
    }
}
于 2019-06-11T01:54:09.877 回答