Springboot 如何使用BindingResult校验参数

 更新时间:2022年01月26日 11:14:18   作者:MyXieZhiXin  
这篇文章主要介绍了Springboot 如何使用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<String> 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<String> getHobbies() {
		return hobbies;
	}
	public void setHobbies(List<String> 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<Pesponsibles> testBindingResult(@Valid @RequestBody Parameter parameter,BindingResult bindingResult)
			{
		log.info("test start");
		Pesponsibles pesponsibles=new Pesponsibles();
		if(bindingResult.hasErrors()){
			 List<FieldError> fieldErrors = bindingResult.getFieldErrors();
			 fieldErrors.forEach(fieldError -> {
                   //日志打印不符合校验的字段名和错误提示
                   log.error("error field is : {} ,message is : {}", fieldError.getField(), fieldError.getDefaultMessage());
                 });
			 for(int i=0;i<fieldErrors.size();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<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,由它来调用具体的验证器

具体的验证器

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

相关文章

  • 关于 Java 的数据结构链表

    关于 Java 的数据结构链表

    这篇文章主要介绍了关于 Java 的数据结构链表的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • Java swing实现应用程序对数据库的访问问题

    Java swing实现应用程序对数据库的访问问题

    这篇文章主要介绍了Java swing实现应用程序对数据库的访问,本次实验需要做一个GUI界面和一个连接查询功能,在论坛上借鉴了其他大佬获取网站内容的部分代码,然后自己做了一个及其简陋的swing界面,算是把这个实验完成了,需要的朋友可以参考下
    2022-09-09
  • Elasticsearch模糊查询详细介绍

    Elasticsearch模糊查询详细介绍

    这篇文章主要给大家介绍了关于Elasticsearch模糊查询的相关资料,在数据库查询中模糊查询是一种强大的技术,可以用来搜索与指定模式匹配的数据,需要的朋友可以参考下
    2023-09-09
  • Spring Data JPA例子代码[基于Spring Boot、Mysql]

    Spring Data JPA例子代码[基于Spring Boot、Mysql]

    这篇文章主要介绍了Spring Data JPA例子代码[基于Spring Boot、Mysql],小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java超详细分析抽象类和接口的使用

    Java超详细分析抽象类和接口的使用

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-04-04
  • Java多线程中的Phaser使用解析

    Java多线程中的Phaser使用解析

    这篇文章主要介绍了Java多线程中的Phaser使用解析,java多线程技术提供了Phaser工具类,Phaser表示“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题,其作用相比CountDownLatch和CyclicBarrier更加灵活,需要的朋友可以参考下
    2023-11-11
  • Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例

    这篇文章主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现

    OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现

    本篇文章主要介绍了OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java 流操作对文件的分割和合并的实例详解

    java 流操作对文件的分割和合并的实例详解

    这篇文章主要介绍了java 流操作对文件的分割和合并的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Java通过反射将 Excel 解析成对象集合实例

    Java通过反射将 Excel 解析成对象集合实例

    这篇文章主要介绍了Java通过反射将 Excel 解析成对象集合实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论