Spring @Valid @Validated实现验证
对于属性的验证有如下一些注解
@notblank:只用在string上,值不能为null,并且trim后长度大于零。不为null,不是全为空格的字符串
@notnull: 不能为null,但可以是长度为零的字符串
@notempty: 不能为null,长度大于零
@null:必须为null
@min(value): 数字,值必须大于等于指定的值
@max(value): 数字,值必须小雨等于指定的值
@decimalmin(value): 数字,值必须大于等于指定的值
@decimalmax(value): 数字,值必须小雨等于指定的值
@digits(integer, fraction):数字,值必须在可接收的范围内@digits(integer=3, fraction=2) 111.22是符合要求的,1111.22不符合,整数部分4位所以不符合要求
@size(min=v1,max=v2): v1<=值<=v2
@asserttrue: 必须为true
@assertfalse: 必须为false
@past: 必须是过去的日期
@future: 必须是将来的日期
@pattern(regex=, flag=): 符合指定的正则表达式
@valid:可以用在方法参数,方法,属性上。用来进行嵌套验证。嵌套验证就是在classa的属性中有classb,而classb的属性也需要进行验证。
@validated:可以用在方法参数,方法上,不能用在属性上。提供了分组的功能,在参数传入时根据分组采用不同的验证机制。说明一下分组,例如对于user的userid,在新建用户时userid必须要为null。在更新用户时userid必须要不为空并且不能都是空格(blank)。这就对userid进行了分组功能,add和update两个组。
@valid实例
book定义
public class book { @notblank(message = "bookid is mandatory, can not be blank") public string bookid; @size(min=5, max=20) @notblank(message = "bookname is mandatory, can not be blank") public string bookname; public string author; @valid public list<chapterinfo> chapterlist; public book(string id, string name, string auth) { bookname = name; author = auth; bookid = id; } }
chapterinfo定义
public class chapterinfo { @min(0) public long chapterid; @notblank @size(min=5, max=50) public string chaptername; @size(min=5, max=20) public string contentid; }
bookcontroller
@restcontroller @requestmapping("/bookcontroller") public class bookcontroller { private list<book> booklist = new arraylist(); @responsebody @requestmapping("/addbooktolist") public boolean addbooktolist(@valid @requestbody book b) { system.out.println(b.bookname); booklist.add(b); return true; } @initbinder private void activatedirectfieldaccess(databinder databinder) { databinder.initdirectfieldaccess(); } }
postman验证
可以看到chapterlist中的chapterinfo的chaptername为blank,验证不通过
@validated实例
public class user { @notblank public string name; @notblank public string address; @min(1) public int age; public boolean isman; @notblank(groups = {update.class}) @null(groups = {add.class}) public string usrid; public interface add{} public interface update{} public user(string name, string addr, int age, boolean isman) { this.name = name; this.address = addr; this.age = age; this.isman = isman; } }
其中对usrid属性使用了@notblank(groups = {update.class})和@null(groups = {add.class})注释。意思是:
(1)update user时usrid不能为blank(要通过usrid查找user去update)
(2)add user时usrid必须为空(要生成新的user,会分配user id)
@restcontroller @requestmapping("/registcontroller") public class registcontroller { list<user> usrlist = new arraylist(); @postmapping(path="/adduser") @responsebody public user adduser(@requestbody @validated({user.add.class}) user usr, bindingresult result) { if (result.haserrors()) { list<objecterror> list = result.getallerrors(); fielderror error = (fielderror)list.get(0); system.out.println(error.getobjectname() + "," + error.getfield() + "," + error.getdefaultmessage()); return null; } user user = new user(usr.name, usr.address, usr.age, usr.isman); string usrid = usrlist.size() + ""; user.usrid = usrid; return user; } }
在adduser的传入参数进行了validated的分组验证(add),如果传入user的usrid不为blank则会出错。
postman验证
usrid不存在时
正常返回新添加的user
指定usrid时
出错
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
参数验证 @Validated 和 @Valid 的区别
-
Spring Boot实现qq邮箱验证码注册和登录验证功能
-
Spring Boot 使用 JSR303 实现参数验证
-
Spring Boot 使用 JSR303 实现参数验证
-
【LeetCode】125.Valid Palindrome(验证回文串)-C++实现
-
荐 Spring Cloud OAuth2实现手机验证码登录
-
如何解决Spring in action @valid验证不生效的问题
-
SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
-
Spring Cloud Feign统一设置验证token实现方法解析
-
Spring @Valid和@Validated区别和用法实例