Grails域验证不起作用

时间:2016-06-01 16:04:02

标签: hibernate validation grails gorm

我正在使用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()  

我输出错误,这是不正确的。

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

2 个答案:

答案 0 :(得分:1)

这对我没有意义。我会在单词constraints中查找拼写错误。

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

// 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

答案 1 :(得分:1)

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

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

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