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

关于BindingResult的使用总结及注意事项

程序员文章站 2022-03-04 14:47:21
目录bindingresult总结及注意事项相关的校验api空检查长度检查booelan检查日期检查其他验证数值检查项目使用中遇到的问题bindingresult作用原理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方法

关于BindingResult的使用总结及注意事项

调用databinder#validate方法后调用constrainttree#validatesingleconstraint,由它来调用具体的验证器

关于BindingResult的使用总结及注意事项

具体的验证器

关于BindingResult的使用总结及注意事项

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。