Grails 域验证不起作用

Grails domain validation does not work

我使用的是 Grails 2.5.4,基于域对象中定义的约束的验证似乎不起作用。鉴于:

class Pet {

    String name

    static constraints = {
        name(nullable: false, blank: false)
    }
}

当我使用如下代码进行测试时:

    Pet p = new Pet()
    if(!p.save()) {
        p.errors.each {
            println it
        }
    }

我希望在控制台上看到验证输出。相反,我在 save() 上收到运行时异常:

Class
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
Message
Column 'name' cannot be null

这不是我所期望的行为。当验证未通过时,save() 不应进行 MySQL 插入调用。有谁知道问题出在哪里?

我还测试了以下内容:

    Pet e = new Pet()
    e.validate()
    println e.hasErrors()  

我得到错误的输出。

当我给宠物命名时,插入工作正常。所以设置似乎没问题。只是验证似乎不起作用。

这对我来说没有意义。我会在 constraints.

这个词中寻找拼写错误

https://github.com/jeffbrown/validationstuff 的项目包含以下域 class:

// grails-app/domain/demp/Pet.groovy
package demo

class Pet {
    String name

    static constraints = {
        name(nullable: false, blank: false)
    }
}

以下控制器:

// grails-app/controllers/demo/DemoController.groovy
package demo

class DemoController {

    def index() {
        def p = new Pet()
        p.validate()
        def hasErrors = p.hasErrors()

        render "Has Errors? $hasErrors"
    }
}

以及以下测试:

// test/unit/demo/DemoControllerSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoController)
@Mock(Pet)
class DemoControllerSpec extends Specification {

    void "test validation"() {
        when:
        controller.index()

        then:
        response.text == 'Has Errors? true'
    }
}

// test/unit/demo/PetSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(Pet)
class PetSpec extends Specification {

    void "test constraints"() {
        expect:
        !new Pet().validate()
    }
}

该应用包含以下内容BootStrap:

// grails-app/conf/BootStrap.groovy
class BootStrap {

    def init = { servletContext ->
        def pet = new demo.Pet()
        pet.validate()

        println "Has Errors? ${pet.hasErrors()}"
    }
    def destroy = {
    }
}

应用程序启动时:

Has Errors? true

问题原来是对 5.0.4 版的 hibernate 插件依赖

版本似乎无法识别 grails 2.x 域 类。

我升级到5.0.8,问题解决了。