龙哥网

龙哥网

关于BindingResult的使用总结及注意事项_java(bindingresult用法)
2022-03-01

目录
  • BindingResult总结及注意事项
    • 相关的校验API
      • 空检查
      • 长度检查
      • Booelan检查
      • 日期检查
    • 其他验证
      • 数值检查
    • 项目使用中遇到的问题
    • BindingResult作用原理

      BindingResult总结及注意事项

      记一个简单又好用的API:BindingResult

      BindingResult使用起来很简单,一般在controller中使用

      作用:用于对前端穿进来的参数进行校验,省去了大量的逻辑判断操作

      相关的校验API

      空检查

      • @NotEmpty:用在集合类上面;不能为null,而且长度必须大于0
      • @NotBlank:用在String上面;只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
      • @NotNull:用在基本类型上;不能为null,但可以为empty。

      长度检查

      • @Size(min=,max=):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 不要错用了异常类型,比如在int上不可用@size
      • @Length(min=, max=):只适用于String 类型

      Booelan检查

      • @AssertTrue:验证 Boolean 对象是否为 true
      • @AssertFalse:验证 Boolean 对象是否为 false

      日期检查

      • @Past:验证 Date 和 Calendar 对象是否在当前时间之前
      • @Future:验证 Date 和 Calendar 对象是否在当前时间之后
      • @Pattern:验证 String 对象是否符合正则表达式的规则

      其他验证

      • @Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
      • @Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
      • @URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL

      数值检查

      建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为"" 时无法转换为int,但可以转换为Stirng为"",Integer为null

      • @Min:验证 Number 和 String 对象是否大等于指定的值
      • @Max:验证 Number 和 String 对象是否小等于指定的值
      • @DecimalMax:被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
      • @DecimalMin:被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
      • @Digits:验证 Number 和 String 的构成是否合法
      • @Digits(integer=,fraction=):验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

      项目使用中遇到的问题

      一开始传入的参数没有使用@Validated 修饰,结果绑定不起作用,参数校验不成功,加上此注解即可生效。

      所以BingdingResult是要与@Validated同时使用的。

      项目中具体使用如下:

      controller中:

      @ApiOperation("添加角色")
      @RequestMapping(value = "/create", method = RequestMethod.POST)
      @ResponseBody
      public CommonResult create(@Validated @RequestBody UmsRole role, BindingResult bindingResult ) {
          int count = roleService.create(role);
          if (count > 0) {
              return CommonResult.success(count);
          }
          return CommonResult.failed();
      }

      domain中:

      import io.swagger.annotations.ApiModelProperty;
      import javax.validation.constraints.NotEmpty;
      import java.io.Serializable;
      import java.util.Date;
      @Data
      public class UmsRole implements Serializable {
          private Long id;
          @ApiModelProperty(value = "名称")
          @NotEmpty(message = "name不能为空!")
          private String name;
          @ApiModelProperty(value = "描述")
          @NotEmpty(message = "描述不能为空!")
          private String description;
          @ApiModelProperty(value = "后台用户数量")
          private Integer adminCount;
          @ApiModelProperty(value = "创建时间")
          private Date createTime;
          @ApiModelProperty(value = "启用状态:0->禁用;1->启用")
          private Integer status;
          private Integer sort;
          private static final long serialVersionUID = 1L;
      

      调用接口返回效果:

      参数:

      {
      “name”:“test”
      }

      返回值:

      {
      “code”: 404,
      “message”: “描述不能为空!”,
      “data”: null
      }

      注意!

      1.@Validated 与BindingResult 需要相邻,否则 变量result 不能接受错误信息

      控制台输出

      Field error in object 'entity' on field '变量': rejected value [null]; codes [NotNull.entity.变量,NotNull.变量,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes

      2.如果使用了@Validated,那么BeanValidate也会抛出异常而不是之前的封装在BindingResult中

      总结:

      使用BindingResult,省去了代码块中的大部分校验

      BindingResult作用原理

      controller代码

      @RequestMapping("")
          public String index(@Valid User user , BindingResult bindingResult){
              if (bindingResult.hasErrors()){
                  List<ObjectError> allErrors = bindingResult.getAllErrors();
                  ObjectError objectError = allErrors.get(0);
                  System.out.println(objectError.getDefaultMessage());
                  System.out.println(objectError.getObjectName());
                  System.out.println(allErrors);
              }
              return "index";
          }

      请求先来到DispatcherServlet的doDispatch 方法,最终会调用ModelAttributeMethodProcessor#resolveArgument方法

      调用DataBinder#validate方法后调用ConstraintTree#validateSingleConstraint,由它来调用具体的验证器

      具体的验证器

      免责声明
      本站部分资源来源于互联网 如有侵权 请联系站长删除
      龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。