我正在使用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()
我输出错误,这是不正确的。
当我给宠物起名字时,插入工作正常。所以设置似乎没问题。只是验证似乎不起作用。
答案 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,问题已解决。