spring-boot v2.3 以上版本需要手动导入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1. 基本数据类型校验
- 在Controller 类上添加注解 `@Validated`
@RestController
@RequestMapping("/test")
@Validated
public class TestController{
}
- 在controller 方法入参上添加 JSR303 注解,开启校验
@GetMapping("/validate")
public JSONReturn listDynamicList(@NotNull(message = "num为空")Integer num){
return JSONReturn.buildSuccessEmptyBody();
}
- 校验结果
{
"actionStatus": "FAIL",
"data": [
"num为空"
],
"errorCode": 400,
"errorInfo": "参数校验失败"
}
2. 引用数据类型校验
- 创建用于接受请求参数的实体类对象
@Data
public class CommentsRequest {
@NotNull(message = "动态id不能为空")
private Long id;
@NotEmpty(message = "评论内容不能为空")
private String text;
}
- 开启校验
在controller 方法上参数添加:
@Valid(不能分组校验) 或 @Validated(可以分组校验) 注解,开启校验
@GetMapping("/validate")
public JSONReturn listDynamicList(@Valid CommentsRequest Param){
return JSONReturn.buildSuccessEmptyBody();
}
- 校验结果
{
"actionStatus": "FAIL",
"data": {
"id": "动态id不能为空",
"text": "评论内容不能为空"
},
"errorCode": 400,
"errorInfo": "参数校验失败"
}
3. 复杂类型校验
3.1 属性是对象类型
@Valid 开启对象校验 【如果对象不为null 才校验属性值的话,可以不加@NotNull注解】
@NotNull 校验对象不能为空
@Data
public class OrderReq {
@NotNull(message = "订单项不能为空")
@Valid // 开启对象校验
private OrderItem orderItem;
@Data
public static class OrderItem {
@NotNull(message = "商品id不能为空")
private Long goodsId;
@NotNull(message = "商品数量不为空")
private Integer goodsNum;
}
}
- 开启参数校验
@PostMapping("/validate3")
public JSONReturn listDynamicList(@RequestBody @Validated OrderReq num){
return JSONReturn.buildSuccessEmptyBody();
}
- 校验结果
{
"actionStatus": "FAIL",
"data": {
"orderItem.goodsNum": "商品数量不为空",
"orderItem.goodsId": "商品id不能为空"
},
"errorCode": 400,
"errorInfo": "参数校验失败"
}
3.2 属性是集合类型
@Valid 开启对象校验,同样也支持集合。 【如果有值才校验的话,下面2个注解可以不加】
@NotNull 集合不能为null
@Size 集合长度校验
@Data
public class OrderReq {
@NotNull(message = "订单项不能为空")
@Valid // 开启对象校验
@Size(min = 1, message = "校验订单项长度") // 如果集合不允许为空的话,需校验下长度。
private List<OrderItem> orderItem;
@Data
public static class OrderItem {
@NotNull(message = "商品id不能为空")
private Long goodsId;
@NotNull(message = "商品数量不为空")
private Integer goodsNum;
}
}
如果你接受的数据类型是:List<Object> param 这种格式的话,校验是不支持的。
解决方案: 你可以在用一个对象包裹下这个集合对象。[ 网上也有其他解决办法(自定义校验器),可自行百度。]
- 开启校验
@PostMapping("/validate4")
public JSONReturn validate4(@RequestBody @Validated OrderReq num){
return JSONReturn.buildSuccessEmptyBody();
}
- 校验结果
{
"actionStatus": "FAIL",
"data": {
"orderItem[0].goodsNum": "商品数量不为空",
"orderItem[0].goodsId": "商品id不能为空"
},
"errorCode": 400,
"errorInfo": "参数校验失败"
}
4. 分组校验
日常开发中有这种情况, 添加和修改是同一个对象封装数据, 修改的时候需要校验Id,保存的时候则不需校验id
- 自定义分组接口
// 修改分组
public interface ModifyGroup{}
// 保存分组
public interface AddGroup{}
- 定义分组校验
@Data
public class OrderReq {
@NotNull(message = "id不能为空", groups = {ModifyGroup.class})
private String id;
@Valid
@NotNull(message = "订单项不能为空", groups = {AddGroup.class})
@Size(min = 1, message = "校验订单项长度",groups = {AddGroup.class})
private List<OrderItem> orderItem;
@Data
public static class OrderItem {
@NotNull(message = "goodsId不能为空", groups = {ModifyGroup.class,AddGroup.class})
private Long goodsId;
}
}
- @Validated 开启分组校验
@RequestMapping("/group")
public JSONReturn testGroup(@RequestBody @Validated({ModifyGroup.class}) OrderReq req){
return JSONReturn.buildSuccessEmptyBody();
}
- 校验结果
{
"actionStatus": "FAIL",
"data": {
"id": "id不能为空"
},
"errorCode": 400,
"errorInfo": "参数校验失败"
}
5.取出校验失败的值
@NotEmpty((message="您输入的值为:{orderSn}不合法")
private String orderSn;
6. @ConvertGroup
@ConvertGroup(from= Default.class , to = Creation.class)
public class ShopKeeperSubject extends BaseBean {}
7. @GroupSequence
如果需要校验的数据字段特别多的时候,是比较消耗内存的,我们可以定义使用这个注解去做短路效果,即:当某些值没通过校验,其他值没必须校验。
/**
* 只有当insert组的所有字段通过了校验,才能开始依次校验Update组的校验
*
*/
@GroupSequence(value = {Group.Insert.class,Group.Update.class})
public class ShopKeeperSubject extends BaseBean {
}
8. @GroupSequenceProvider
自定义校验逻辑,需要自定义实现 DefaultGroupSequenceProvider 接口,重写getValidationGroups 方法。比如: 当某个字段的值为1时校验某个分组。
@Data
@GroupSequenceProvider(PersonGroupSequenceProvider.class)
public class ShopKeeperSubject extends BaseBean{}