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

来源:互联网 发布:python培训视频 编辑:程序博客网 时间:2024/05/16 18:09

上一节建立一个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.errors10         assertEquals "size.toosmall", errors.getFieldError("password").code11         assertEquals "tiny", errors.getFieldError("password").rejectedValue12         assertEquals "url.invalid",    errors.getFieldError("homepage").code13         assertEquals "not-a-url", errors.getFieldError("homepage").rejectedValue14         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)blankemail验证内容是否为email地址userEmail(email:true)email.invalidinList验证值是否在这个集合的范围内

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

not.inListmatches表达式匹配

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

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

size.toosmall或者size.toobig

unique唯一性检查userId(unique:true)uniqueurl是否为一个有效的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.userId4     })5     homepage(url: true, nullable: true)6 }