关于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,由它来调用具体的验证器
具体的验证器
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
下一篇: 09JavaScript函数