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


    问题:

      项目中常用@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);
                    }
                }
            }
        }
  • 相关阅读:
    注意:MagickReadImageBlob() 引发的问题
    Notepad++ 【自动完成】与【输入时提示函数参数】互相冲突,无奈
    收藏:png8和png24的根本区别
    【物理分辨率】与【逻辑分辨率】
    算法
    算法
    Linux 用户和文件
    Oracle索引技术研究
    Linux Socket
    Linux Socket
  • 原文地址:https://www.cnblogs.com/july-sunny/p/13870289.html
Copyright © 2020-2023  润新知