一、场景说明
-
嵌套校验,指的是在一个
Bean
对象中的某个属性值也是一个Bean
对象,这个子的属性值中的属性也需要校验,这种场景就属于嵌套校验 -
在上述对嵌套校验多解说,我们在日常多软件开发过程中,也经常会遇到这样的场景
二、校验场景
-
查询订单商品信息
-
订单对象中包含商品信息
-
在请求接口的时候需要对订单属性进行校验的同时也需要校验商品信息
三、框架使用
-
定义请求
Bean
@Data @ToString public class Order implements Serializable { private static final long serialVersionUID = 784930215432L; /** 订单号*/ private int id; /** 订单名称*/ @NotNull(message = "订单名称不能为空") private String orderName; /** 订单状态 定制化注解,支持参数值与指定类型数组列表值进行匹配(缺点是需要将枚举值写死在字段定义的注解中)*/ @EnumValidated(strValues = {"FAIL", "PAYED"}, message = "只能查询指定状态的订单信息-1") private String orderState; /** 订单状态枚举 定制化注解,实现参数值与枚举列表的自动匹配校验(能更好地与实际业务开发匹配)*/ @EnumValidated(enumValues = OrderStateEnum.class, message = "只能查询指定状态的订单信息-2") private String orderStateEnum; /** 商品列表*/ @Valid private List<Goods> goodsList; }
@Data @ToString public class Goods implements Serializable { private static final long serialVersionUID = 67493246372918L; /** 自增ID*/ private String id; /** 商品ID*/ @NotNull(message = "商品ID不能为空") private String goodsId; /** 商品名称*/ @NotNull(message = "商品名称不能为空") private String goodName; }
-
创建控制层并对嵌套
Bean
进行校验@PostMapping("/order") @ApiOperation(value = "订单查询", notes = "订单查询,校验嵌套校验和自定义校验注解,抛出异常由统一异常处理") public DataResult orderList(@RequestBody @Validated Order order) { log.info("The oder request is {}", order.toString()); return DataResult.success(); }
-
模拟请求参数
{ "goodsList": [ { "goodName": "string", "id": "string" } ], "id": 0, "orderName": "string", "orderState": "FAIL1", "orderStateEnum": "PAYED" }
-
校验响应结果
{ "code": 10009, "msg": "商品ID不能为空;只能查询指定状态的订单信息-1;", "detail": null, "data": null }
-
特别提示,如果对象模型中存在子模型,那么对与子模型的校验则需要加上
@Valid
注解