zoukankan      html  css  js  c++  java
  • Spring boot @Validated注解以及配合@Valid的使用

     https://blog.csdn.net/MR_L_0927/article/details/84784482

    简单的方法是 直接在Controller内的接口参数前加上校验注解(@NotBlank...等),此时需在类上加注解  @Validated即可.当校验参数过多,这种方法使接口参数看起来过于臃肿,代替的选择是使用 @Validated 注解来进行一些参数的验证.

    第一步 Bean实体类加注解
    下面是验证注解的类型

    @Null 只能为null
    @NotNull 必须不为null
    @Max(value) 必须为一个不大于 value 的数字
    @Min(value)  必须为一个不小于 value 的数字
    @AssertFalse 必须为false
    @AssertTrue 必须为true
    @DecimalMax(value) 必须为一个小于等于 value 的数字
    @DecimalMin(value) 必须为一个大于等于 value 的数字
    @Digits(integer,fraction) 必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Past  必须是 日期 ,且小于当前日期
    @Future 必须是 日期 ,且为将来的日期
    @Size(max,min) 字符长度必须在min到max之间
    @Pattern(regex=,flag=) 必须符合指定的正则表达式
    @NotEmpty 必须不为null且不为空(字符串长度不为0、集合大小不为0)
    @NotBlank  必须不为空(不为null、去除首位空格后长度不为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    @Email 
    必须为Email,也可以通过正则表达式和flag指定自定义的email格式

     
    public class User {

    @NotEmpty(message = "姓名不能为空")
    private String username;

    @Size(min=6 ,max= 20 ,message = "密码长度应在6--20位之间")
    private String password;
    }


    第二步 Controller层编写
    在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult br接收校验出错信息

    @RestController
    @RequestMapping(value = "user")
    public class UserController {

    @GetMapping(value = "msg")
    public String User(@Validated User user, BindingResult br) {
    if(br.hasErrors()) {
    return "error";
    }
    return "success";
    }

    }
    需要注意的是, BindingResult br 一定要跟在 @Validated 注解对象的后面,且当有多个@Validated
    注解时,每个注解对象后面都需要添加一个 BindingResult br.即
    (@Validated User user, BindingResult brOfUser,
    @Validated Goods goods, BindingResult brOfGoods)

    判断是否有误时也需要分别判断, brOfUser.hasErrors,brOfGoods.hasErrors
    而且 BindingResult 只能跟在 实体类 后面.否则会报
    java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public void com.yoona.TestAnnotation.myTest(java.lang.String,org.springframework.validation.BindingResult)
     

    @Validated还提供分组验证功能

    第一步 创建分组接口
    public interface groupOne{
    }

    public interface groupTwo{
    }
     

    第二步 Bean实体类中添加分组
    public class User {

    @NotEmpty(groups={groupOne.class},message = "姓名不能为空")
    private String username;

    @Size(groups={groupTwo.class},min=6 ,max= 20 ,message = "密码长度应在6--20位之间")
    private String password;
    }
    第三步 Controller中参数添加接口
    @RestController
    @RequestMapping(value = "user")
    public class UserController {

    @GetMapping(value = "msg")
    public String User(@Validated({groupOne.class}) User user, BindingResult br) {
    if(br.hasErrors()) {
    return "error";
    }
    return "success";
    }
    }
    这样就只验证 User 类中的 属性为 groupOne 组内的属性,而 属于 groupTwo 组内的属性不需验证.

    默认情况下,分组验证时无序的,但是有些情况下,验证顺序很重要(如第一个验证不通过,后面的验证就不需要),可以使用@GroupSequence 注解进行排序

    /*
    * 分组顺序接口类
    */
    import javax.validation.GroupSequence;

    //分组序列先Frist再Second
    @GroupSequence({First.class,Second.class})
    public interface Group{
    }


    Controller层
    @RestController
    @RequestMapping(value = "user")
    public class UserController {

    @GetMapping(value = "msg")
    public String User(@Validated({Group.class}) User user, BindingResult br) {
    if(br.hasErrors()) {
    return "error";
    }
    return "success";
    }
    在含有嵌套验证的时候,需要 @Validated 与 @Valid 配合使用,需要注意的是,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别.但是 @Valid 暂不支持分组功能.@Validated不能用于成员属性上,@Valid可以.

    public class User {
    @NotNull
    private String name;
    @NotNull
    private List<Persion> persions;
    }


    public class Persion {
    @NotBlank(message = "性别不能为空")
    private String gender;
    }
    此时在 Controller 中,

    @RestController
    @RequestMapping(value = "user")
    public class UserController {

    @GetMapping(value = "msg")
    public String User(@Validated User user, BindingResult br) {
    if(br.hasErrors()) {
    return "error";
    }
    return "success";
    }
    }


    @Validates 加在 User 前,只会对 User 的属性验证,而嵌套的 Persion 内的属性不会验证.如果想要全部验证,则只需要在实体类中

    public class User {
    @NotNull
    private String name;
    @Valid //此处加该注解,就可以嵌套验证
    @NotNull
    private List<Persion> persions;
    }


    public class Persion {
    @NotBlank(message = "性别不能为空")
    private String gender;
    }
    参数数量比较少时,可以直接使用需要的校验注解,不需使用@Validates或@Valid.

    public volid func(@NotNull @Length(min = 6, max = 6, message = "请求参数有误") String str, HttpServletRequest rq, HttpServletResponse rp){
    // .....................
    }
     
    ————————————————
    原文链接:https://blog.csdn.net/MR_L_0927/article/details/84784482

  • 相关阅读:
    css篇-less,scss 用calc问题
    工具篇-Mac上搭建本地svn服务器以及使用Cornerstone进行本地版本控制
    小程序篇-开发工具报错
    js篇-json字符串与json对象相互转化
    小程序篇- data 数据绑定
    RN-android 打包后,部分图片不显示
    asxios--form data提交,setcookie
    RN-系列
    纯css 实现横向滚动条--移动端
    Oralce给字段追加字符,以及oracle 给字段替换字符
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12603370.html
Copyright © 2011-2022 走看看