Springboot 如何使用BindingResult校验参数

网友投稿 1338 2022-11-04

Springboot 如何使用BindingResult校验参数

Springboot 如何使用BindingResult校验参数

目录使用BindingResult校验参数1、创建一个参数对象2、controller控制层写参数接收的入口3、传入参数和控制台打印结果4、常用校验注解BindingResult 作用原理

使用BindingResult校验参数

1、创建一个参数对象

import java.util.List;

import javax.validation.constraints.Min;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

import org.hibernate.validator.constraints.NotBlank;

import org.hibernate.validator.constraints.NotEmpty;

public class Parameter {

@NotEmpty(message="姓名不能为空")

private String name;

@Min(value = 18, message = "年龄必须大于18岁")

private int age;

@NotEmpty(message="hobbies不能为空")

private List hobbies;

@NotBlank(message="账号不能为空")

private String account;

@Size(min=5,max=10,message="密码的长度应该在5和10之间")

private String password;

@Email(message="邮箱格式错误")

private String email;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public List getHobbies() {

return hobbies;

}

public void setHobbies(List hobbies) {

this.hobbies = hobbies;

}

public String getAccount() {

return account;

}

public void setAccount(String account) {

this.account = account;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

2、controller控制层写参数接收的入口

需要注意的是@Valid 和 BindingResult 是一 一对应的,如果有多个@Valid,那么每个@Valid后面都需要添加BindingResult用于接收bean中的校验信息

@RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_jsON_VALUE)

public @ResponseBody ResponseEntity testBindingResult(@Valid @RequestBody Parameter parameter,BindingResult bindingResult)

{

log.info("test start");

Pesponsibles pesponsibles=new Pesponsibles();

if(bindingResult.hasErrors()){

List fieldErrors = bindingResult.getFieldErrors();

fieldErrors.forEach(fieldError -> {

//日志打印不符合校验的字段名和错误提示

log.error("error field is : {} ,message is : {}", fieldError.getField(), fieldError.getDefaultMessage());

});

for(int i=0;i

//控制台打印不符合校验的字段名和错误提示

System.out.println("error field is :"+fieldErrors.get(i).getField()+",message is :"+fieldErrors.get(i).getDefaultMessage());

}

// pesponsibles.setError_msg(fieldErrors);

return new ResponseEntity<>(pesponsibles, HttpStatus.BAD_REQUEST);

}

return new ResponseEntity<>(pesponsibles, HttpStatus.OK);

}

3、传入参数和控制台打印结果

如下图所示:

log日志编码集没有修改所以是乱码,返回结果我并没有返回错误信息,在此只是在控制台打印出来,实际情况再根据实际需要返回给前台呈现

4、常用校验注解

@Null 只能是null@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值@AssertFalse 必须为false@AssertTrue 必须是true

字符串/数组/集合检查:(字符串本身就是个数组)

@Pattern(regexp="reg") 验证字符串满足正则@Size(max, min) 验证字符串、数组、集合长度范围@NotEmpty 验证字符串不为空或者null@NotBlank 验证字符串不为null或者trim()后不为空

数值检查:同时能验证一个字符串是否是满足限制的数字的字符串

@Max 规定值得上限int@Min 规定值得下限@DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值 @DecimalMin 可以用来限制浮点数大小@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2@Digits 无参数,验证字符串是否合法@Range(min=long1,max=long2) 检查数字是否在范围之间 这些都包括边界值

日期检查:Date/Calendar

@Post 限定一个日期,日期必须是过去的日期@Future 限定一个日期,日期必须是未来的日期

其他验证:

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

BindingResult 作用原理

controller代码

@RequestMapping("")

public String index(@Valid User user , BindingResult bindingResult){

if (bindingResult.hasErrors()){

List allErrors = bindingResult.getAllErrors();

ObjectError objectError = allErrors.get(0http://);

System.out.println(objectError.getDefaultMessage());

System.out.println(objectError.getObjectName());

System.out.println(allErrors);

}

return "index";

}

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

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

具体的验证器

//控制台打印不符合校验的字段名和错误提示

System.out.println("error field is :"+fieldErrors.get(i).getField()+",message is :"+fieldErrors.get(i).getDefaultMessage());

}

// pesponsibles.setError_msg(fieldErrors);

return new ResponseEntity<>(pesponsibles, HttpStatus.BAD_REQUEST);

}

return new ResponseEntity<>(pesponsibles, HttpStatus.OK);

}

3、传入参数和控制台打印结果

如下图所示:

log日志编码集没有修改所以是乱码,返回结果我并没有返回错误信息,在此只是在控制台打印出来,实际情况再根据实际需要返回给前台呈现

4、常用校验注解

@Null 只能是null@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值@AssertFalse 必须为false@AssertTrue 必须是true

字符串/数组/集合检查:(字符串本身就是个数组)

@Pattern(regexp="reg") 验证字符串满足正则@Size(max, min) 验证字符串、数组、集合长度范围@NotEmpty 验证字符串不为空或者null@NotBlank 验证字符串不为null或者trim()后不为空

数值检查:同时能验证一个字符串是否是满足限制的数字的字符串

@Max 规定值得上限int@Min 规定值得下限@DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值 @DecimalMin 可以用来限制浮点数大小@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2@Digits 无参数,验证字符串是否合法@Range(min=long1,max=long2) 检查数字是否在范围之间 这些都包括边界值

日期检查:Date/Calendar

@Post 限定一个日期,日期必须是过去的日期@Future 限定一个日期,日期必须是未来的日期

其他验证:

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

BindingResult 作用原理

controller代码

@RequestMapping("")

public String index(@Valid User user , BindingResult bindingResult){

if (bindingResult.hasErrors()){

List allErrors = bindingResult.getAllErrors();

ObjectError objectError = allErrors.get(0http://);

System.out.println(objectError.getDefaultMessage());

System.out.println(objectError.getObjectName());

System.out.println(allErrors);

}

return "index";

}

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

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

具体的验证器

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Http接口调用示例教程
下一篇:maplab 一个开放,面向研究用C++编写的可视惯性映射框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~