/** * @author Yangqi.Pang */ @RestController @RequestMapping("/warehouse") public class WarehouseAllocateController { @Autowired private WarehouseShipperService warehouseShipperService; @PostMapping("/allocate") public ApiResult<Object> allocate(@RequestBody AllocationReq allocationReq){ //TODO 分仓规则 return ApiResult.success(); } @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class AllocationReq { /** * 收货货主编号 */ private String storeShipperCode; /** * 发货货主编号 */ private String deliverShipperCode; /** * 订单类型 */ @NotNull(message = "订单类型") private OrderType orderType; /** * 货品明细 */ @NotEmpty(message = "货品明细不能为空") private List<GoodsDetail> goodsDetails; } @Getter @AllArgsConstructor public enum OrderType { /** * 入库单 */ STORE, /** * 出库单 */ DELIVER, /** * 调拨单 */ TRANSFER } @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class GoodsDetail { /** * 货主货品编码 */ @NotBlank(message = "货主货品编码不能为空") private String shipperGoodsCode; /** * 批次号 */ private String batchNo; /** * 数量 */ @NotNull(message = "数量不能为空") private BigDecimal num; } }
如代码所示:如何在Controller层校验goodsDetails 所传的参数?
1.Controller层加@Validated注解
走单元测试校验参数:
public class WarehouseAllocateControllerTest extends BaseTest { @Autowired private WarehouseAllocateController warehouseAllocateController; @Test @DisplayName("分仓规则传参校验单元测试") public void testValidate(){ WarehouseAllocateController.AllocationReq allocationReq = WarehouseAllocateController.AllocationReq.builder() .build(); warehouseAllocateController.allocate(allocationReq); } }
校验结果:
我没有传参数,但是校验通过了,说明校验不起做用
2.方法层加@Validated
校验结果:
还是能通过,说明校验还是不起作用
2.方法层加@Vaild
校验结果:
校验不通过,说明校验有效
3.单元测试增加参数
校验结果:
校验通过,但有个问题是,我只是传了一个空的对象,没有校验集合里面的对象的属性:
4.对象集合属性上加@Valid
校验结果:
校验不通过,说明校验有作用
总结:如果校验的对象是集合,而且还要校验的是集合里面的每个对象的属性时,就可以采用此种方式:Controller层加@Validated,方法层加@Valid, 集合属性上加@Valid 就可以实现完整校验;