欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring @Valid @Validated实现验证

程序员文章站 2022-06-20 12:46:45
对于属性的验证有如下一些注解 @notblank:只用在string上,值不能为null,并且trim后长度大于零。不为null,不是全为空格的字符串 @notnull: 不能为n...

对于属性的验证有如下一些注解
@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验证

Spring @Valid @Validated实现验证

可以看到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不存在时

Spring @Valid @Validated实现验证

正常返回新添加的user

指定usrid时

Spring @Valid @Validated实现验证

Spring @Valid @Validated实现验证

出错

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。