【参数校验】手动参数校验

问题:

  项目中常用@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