问题:
项目中常用@Validate 或者 @Valid 去对接口的入参做参数校验,
最近项目中遇到另外一种情况,仅使用注解似乎难以满足需求:
例如:实际情况中需要针对channel字段做进一步校验,如channel为1(也就是IOS),则需要进一步校验appId字段不能为空
public class RechargeConfigDTO { @NotNull(message = "主键不能为空") private Integer dbId; /** * 金额 */ @NotNull(message = "金额不能为空") private BigDecimal nnAmount; /** * 客户端 1.ios 2.android 3.nn web */ @NotNull(message = "xxx不能为空") @ApiModelProperty(value = "客户端 1.ios 2.android 3.nn web") private Integer channel; /** * 客户端为苹果,该项必填 */ @ApiModelProperty(value = "客户端为苹果,该项必填") private String appId; }
这个问题本质上很好解决,项目代码中使用if-else判断类型即可,但非常不灵活,而且会污染业务代码,因为这些参数本质上属于入参校验,不需要在业务层做过多的代码参数校验
这里提供了一个方法,即使用Validate的Api去做校验,这里可以放置在入参DTO对象中,避免污染业务代码
/** * 处理分组校验:如果是IOS配置类型,需要再做一次校验 */ public void handleValidateGroup() { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); if (ChannelEnum.IOS.getCode().equals(this.getChannel())) { Set<ConstraintViolation<RechargeConfigDTO>> set = validator.validate(this, IOSConfig.class); if (!CollectionUtils.isEmpty(set)) { for (ConstraintViolation<RechargeConfigDTO> cv : set) { String message = cv.getPropertyPath().toString().concat(cv.getMessage()); throw new JeecgBootExceptionHandler(message); } } } }
原文:https://www.cnblogs.com/july-sunny/p/13870289.html