02 Spring Validation

Spring 为了给开发者提供便捷,对 hibernate validation 进行了二次封装,显示校验 validated bean 时,可以使用 spring validation 或者 hibernate validation。

注解

JSR 提供的校验注解:

注解
说明

@Null

被注释的元素必须为 null

@NotNull

被注释的元素必须不为 null

@AssertTrue

被注释的元素必须为 true

@AssertFalse

被注释的元素必须为 false

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max=, min=)

被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past

被注释的元素必须是一个过去的日期

@Future

被注释的元素必须是一个将来的日期

@Pattern(regex=,flag=)

被注释的元素必须符合指定的正则表达式

Hibernate Validator 提供的校验注解:

注解
说明

@NotBlank()

验证字符串非 null,且长度必须大于 0

@Email

被注释的元素必须是电子邮箱地址

@Length(min=,max=)

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的必须非空

@Range(min=,max=,message=)

被注释的元素必须在合适的范围内

首先定义 validated bean:

在 Controller 中使用:

  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,且提供分组功能

  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

如果有多个参数需要校验,形式可以如下,即一个校验类对应一个校验结果:

分组校验

如果同一个类,在不同的使用场景下有不同的校验规则,那么可以使用分组校验。

在 Controller 中使用,注意使用分组功能必须使用 @Validated 注解:

验证方式

验证请求体

验证请求体(RequestBody),需要验证的参数上加上了 @Valid 注解,如果验证失败,它将抛出 MethodArgumentNotValidException。默认情况下,Spring 会将此异常转换为 HTTP Status 400(错误请求)。

Controller:

ExceptionHandler:

验证请求参数

一定一定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。

Controller:

ExceptionHandler:

验证 Service 方法

此外还可以验证任何 Spring 组件的输入,而不是验证控制器级别的输入,我们可以使用 @Validated@Valid 注释的组合来实现这一需求。

一定一定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。

自定义 Validator

验证枚举值

主要实现:

  • Flag

  • FlagValidator

使用:

验证范围值

需求:Person 类有一个 region 字段,region 字段只能是 China、China-Taiwan、China-HongKong 这三个中的一个。

使用:

校验电话号码

使用:

参考文章: 使用 spring validation 完成数据后端校验 spring-bean-validation

最后更新于

这有帮助吗?