您的位置 首页 java

spring bean validation入门及原理

参数校验 是web项目中必须要做的事情。spring框架中有提供 spring bean validation,其底层就是封装的hibernate validation,而hibernate validation是 java bean validation规范的具体实现。

因此,先了解下hibernate validation的具体使用,再来探究下spring bean validation的使用和原理。

1 hibernate validation了解与使用

先创建个springboot项目,方便后面spring bean validation使用。

pom.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<project xmlns=”#34;
xmlns:xsi=”#34;
xsi:schemaLocation=” #34;>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xtl</groupId>
<artifactId>bean-validation</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

javax.validation,hibernate-validator不需要额外导入了,项目中已经包含了这两个依赖了

spring bean validation入门及原理

这两个接口,定义了校验方法

1.1 对java bean进行校验

Validator中的接口方法:

 <T> Set<ConstraintViolation<T>> validate(T var1, Class<?>... var2)  

校验bean对象中的所有约束。

接下来,示例演示:

创建ValidateUser对象

 @Data

public class ValidateUser {

    @NotNull

    private String name;

    @NotNull

    @Min(0)

    private Integer age;

}  

写个测试方法

 /**

 * java bean validate

 */
public static void test1() {

    ValidateUser user = new ValidateUser();

    user.setAge(-2);



    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

    Validator validator = factory.getValidator();



    Set<ConstraintViolation<ValidateUser>> result = validator.validate(user);



    result.stream().forEach(v -> {

        Path propertyPath = v.getPropertyPath();

        String message = v.getMessage();

        Object invalidValue = v.getInvalidValue();

        System.out.println(propertyPath + " " + message + ":" + invalidValue);

    });

}  

Main方法中运行,查看结果

spring bean validation入门及原理

1.1 对方法参数进行校验

方法参数校验,我们用ExecutableValidator接口中的validateParameters方法

 <T> Set<ConstraintViolation<T>> validateParameters(T var1, Method var2, Object[] var3, Class<?>... var4)  

先创建一个工作类 获取校验器

spring bean validation入门及原理

创建测试方法

spring bean validation入门及原理

测试运行,结果

spring bean validation入门及原理

有时方法参数是个对象,此时如果要对对象中的属性进行校验 需要再加@Valid注解

spring bean validation入门及原理

进行测试

spring bean validation入门及原理

不加@Valid注解,校验通过,

加@Valid注解后,参数对象的属性才会被校验

1.1 对方法返回值进行校验

返回值校验,用到ExecutableValidator接口中的validateReturnValue方法

 <T> Set<ConstraintViolation<T>> validateReturnValue(T var1, Method var2, Object var3, Class<?>... var4)  

示例;

spring bean validation入门及原理

测试运行结果

spring bean validation入门及原理

2 spring项目bean validation

2.1 json传参对象校验

spring bean validation入门及原理

spring bean validation入门及原理

在对象上加上@Validated或@Valid注解都可以

在访问该接口时,spring会先校验参数对象

校验不通过的话,会抛出MethodArgumentNotValidException异常,spring默认会将其转为400(Bad Request)

spring bean validation入门及原理

项目中 我们可以使用统一异常处理 返回错误信息

spring bean validation入门及原理

2.2 参数一个个平铺到方法入参中的场景

此时必须在类上加@Validated注解,并且方法入参上加上校验相关的注解

spring bean validation入门及原理

校验不通过,会抛出ConstraintViolationException异常,同样进行统一异常处理

spring bean validation入门及原理

spring bean validation入门及原理

2.3 表单传参 参数对象接收

参数对象前 加@Valid或@Validated注解就可以

spring bean validation入门及原理

校验不通过会 抛出BindException异常,同样进行统一异常处理

spring bean validation入门及原理

测试

spring bean validation入门及原理

3 spring bean validation底层校验原理

3.1 json传参校验原理

sprIngmvc中 RequestResponseBodyMethodProcessor 会解析@RequesetBody注解标注的参数,封装参数对象的,显然校验逻辑会在这里

我们看看其resolveArgument方法

spring bean validation入门及原理

spring bean validation入门及原理

spring bean validation入门及原理

最后调用Spring的Validator进行校验,而spring的Validator实现内部就是对hibernate validation的封装

3.2 方法参数平铺 校验原理

其原理是aop,因为在类上加了@Validated注解,启动时会被MethodValidationPostProcessor类进行切面

spring bean validation入门及原理

最终在MethodValidationInterceptor类中进行处理

spring bean validation入门及原理

3.3 对象接收参数 校验原理

ModelAttributeMethodProcessor类会处理 参数解析

看起resolveArgument方法

其中有段逻辑是进行参数校验的

spring bean validation入门及原理

后面的逻辑和3.1一样了

3.4 总结

原理都是在调用controller方法前 进行参数校验,要不就是解析参数时,要不就是切面进行参数校验,底层还是封装的hibernate validation

4 spring bean validation分组功能

有时一个java bean对象 在多个方法中使用,但校验需求不一样,这时可以用 校验分组功能

比如 save方法 不要求User.id有值,而update方法要求有值

此时User对象可以这样写

spring bean validation入门及原理

使用时,@Validate注解上加上分组值

就可以实现上述需求了

文章来源:智云一二三科技

文章标题:spring bean validation入门及原理

文章地址:https://www.zhihuclub.com/194213.shtml

关于作者: 智云科技

热门文章

网站地图