Spring Boot 进行Bean Validate和Method Validate

Posted 长乐忘忧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 进行Bean Validate和Method Validate相关的知识,希望对你有一定的参考价值。

SpringBoot在内部通过集成hibernate-validation 已经实现了JSR-349验证规范接口,在SpringBoot项目中只要直接使用就行了。

一般用在Controller中用于验证前端传来的参数。

验证分两种:对封装的Bean进行验证  或者  对方法简单参数的验证

一、进行BeanValidate

1.定义Bean

public class ValidBean {
    @NotNull(message = "名字不能为空")
    private String name;

    @Min(value = 18, message = "年龄必须大于18")
    private int age;

    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;
    }
}

  2.使用

@RequestMapping("bean")
    @ResponseBody
    public String say(@Valid ValidBean bean, BindingResult bindingResult){        
        return bindingResult.hasErrors() ? 
		bindingResult.getFieldError().getDefaultMessage() : "incorrect";
    }

3.注意
@Valid 和 BindingResult 是一一对应的,如果有多个@Valid,那么每个@Valid后面跟着的BindingResult就是这个@Valid的验证结果,顺序不能乱

4.Api
@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=) 用于校验一个字符串是否是合法URL

 

二、进行MethodValidate

1.注入MethodValidationPostProcessor Bean

@Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

2.在要MethodValidate的类上加上注解@Validated
3.在方法中使用

     @Controller
	@Validated
	@RequestMapping("valid")
	public class ValidController {
		@RequestMapping("/check")
		@ResponseBody
		public String check(@Min(value = 2,message = "age必须大于2") int age) {
			return "" + age;
		}
	}

4.处理校验失败
默认校验失败后会让方法抛出Unchecked Exception,在springboot中默认是会让其跳转到error页面,所以只要添加一个这个异常的处理器就行:

@ExceptionHandler(value = { ConstraintViolationException.class })
    @ResponseBody
    public String handleResourceNotFoundException(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
        StringBuilder strBuilder = new StringBuilder();
        for (ConstraintViolation<?> violation : violations ) {
            strBuilder.append(violation.getMessage() + "\n");
        }
        return strBuilder.toString();
    } 

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

三、自定义异常处理
用到再查,网上很多例子

 

 

四、

验证其实基于spring AOP ,所以其实任何Spring Bean都能利用这些注解做验证,比如Service层。但用的最多的还是Controller层






































以上是关于Spring Boot 进行Bean Validate和Method Validate的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 2.1.15.RELEASE(junit 4) 进行集成测试的 Bean 自动装配为 null

我想在 Spring Boot 集成测试中创建 bean 之前模拟服务器

Spring Boot 学习系列(09)—自定义Bean的顺序加载

Spring Boot 学习系列(09)—自定义Bean的顺序加载

Spring Boot-------JPA——EntityManager构建通用DAO

Spring Boot 1.4 @DataJpaTest - 创建名为“dataSource”的 bean 时出错