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,问题解决了。
我使用的是 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,问题解决了。