上一节建立一个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地址 | 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 }