spring-boot 数据校验

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值