NEO

蜀道难,难于上青天!

导航

20130515-Grails In Action-3、建模(02小节)

Posted on 2013-05-15 23:36  页面载入出错  阅读(292)  评论(0编辑  收藏  举报

上一节建立一个User domain对象,这一节主要了解怎么样对对象的属性进行验证

1、对象验证

在User对象中增加数据验证

1     static constraints = {
2         userId(size:3..20, unique: true)
3         password(size: 6..8)
4         homepage(url: true, nullable: true)
5     }

2、测试验证代码

com.grailsinaction.UserIntegrationTests

 1     /**
 2      * 测试验证
 3      */
 4     @Test
 5     void testEvilSave() {
 6         def user = new User(userId: 'chuck_norris',    password: 'tiny', homepage: 'not-a-url')
 7         assertFalse user.validate()
 8         assertTrue user.hasErrors()
 9         def errors = user.errors
10         assertEquals "size.toosmall", errors.getFieldError("password").code
11         assertEquals "tiny", errors.getFieldError("password").rejectedValue
12         assertEquals "url.invalid",    errors.getFieldError("homepage").code
13         assertEquals "not-a-url", errors.getFieldError("homepage").rejectedValue
14         assertNull errors.getFieldError("userId")
15     }

这段代码的关键点是:

assertFalse user.validate()

这句代码,直接调用User对象的validate()方法,就可以检查User对象的验证内容,所以,在其他service或者controller中都可以调用该方法完成验证,如:

1     if (user.validate()) {
2         user.save()
3     } else {
4         user.discard()
5     }

3、验证,修正测试

 1     /**
 2      * 验证并修正、保存
 3      */
 4     @Test
 5     void testEvilSaveCorrected() {
 6         def user = new User(userId: 'chuck_norris',    password: 'tiny', homepage: 'not-a-url')
 7         assertFalse(user.validate())
 8         assertTrue(user.hasErrors())
 9         assertNull user.save()
10         
11         user.password = "fistfist"
12         user.homepage = "http://www.chucknorrisfacts.com"
13         assertTrue(user.validate())
14         assertFalse(user.hasErrors())
15         assertNotNull user.save()
16     }

4、以下为一些常用的验证方法:

常用标准验证
约束名称 描述 例子 错误属性
blank 验证字符串不能为空 password(blank:false) blank
email 验证内容是否为email地址 userEmail(email:true) email.invalid
inList 验证值是否在这个集合的范围内

country(inList:['Australia','England')

not.inList
matches 表达式匹配

userId(matches: '[0-9]{7}[A-Za-z]')

matches.invalid
maxSize 范围最大值验证 orderQuantity(maxSize:100) maxSize.exceeded
minSize 范围最小值验证 orderQuantity(minSize:10) minSize.notmet
nullable 是否允许为空 password(nullable: false) nullable
size 给值指定一个范围 userId(size:3..20)

size.toosmall或者size.toobig

unique 唯一性检查 userId(unique:true) unique
url 是否为一个有效的URL地址 homepage(url:true)

url.invalid

validator 可以通过一个闭包自定义验证 5、6专门涉及

validator.error

5、使用正则表达式,进行自定义验证

如:用户ID只允许是7个数字后面跟一个字母

1 static constraints = {
2     userId(matches: '[0-9]{7}[A-Za-z]')
3 }

6、再复杂一点的组合自定义验证

用户密码必须是6-8位,并且账号和密码不能相等

1 static constraints = {
2     password(size: 6..8, validator: { passwd, user ->
3         return passwd != user.userId
4     })
5     homepage(url: true, nullable: true)
6 }