• Hibernate 参数校验之关联数据校验


    1.定义注解

    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.*;
    
    
    @Target({ElementType.PARAMETER, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = {RelationValueValidator.class})
    public @interface RelationValue {
     
       /**默认错误消息*/
        String message() default "必须为指定值";
    
        //分组
        Class[] groups() default {};
     
        //负载
        Class[] payload() default {};
     
    
    }

    2.实现自定义注解

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.beans.PropertyDescriptor;
    import java.util.HashMap;
    import java.util.Map;
    
    public class RelationValueValidator implements ConstraintValidator {
    
       @Override
       public boolean isValid(Object value, ConstraintValidatorContext context) {
          Map fieldValMap = this.getFieldValMap(value);
          Integer strategyStatus = (Integer)fieldValMap.get("targetStatus");
          if (null != strategyStatus) {
             if (strategyStatus > 0) {
                Integer targetScopeStart = (Integer)fieldValMap.get("targetStart");
                Integer targetScopeEnd = (Integer)fieldValMap.get("targetEnd");
                if (targetScopeStart < 1 || targetScopeEnd < 1) {
                   return false;
                }
             }
          }
          return true;
       }
    
    
    
       /**
        * 获取自定义类型字段
        *
        * @param obj
        * @return
        */
       private Map getFieldValMap(Object obj) {
          HashMap fieldValMap = Maps.newHashMap();
          Class clz = obj.getClass();
          try {
             PropertyDescriptor strategyStatus = new PropertyDescriptor("targetStatus", clz);
             PropertyDescriptor targetStart = new PropertyDescriptor("targetStart", clz);
             PropertyDescriptor targetEnd = new PropertyDescriptor("targetEnd", clz);
             fieldValMap.put("targetStatus", strategyStatus.getReadMethod().invoke(obj));
             fieldValMap.put("targetScopeStart", targetStart.getReadMethod().invoke(obj));
             fieldValMap.put("targetScopeEnd", targetEnd.getReadMethod().invoke(obj));
          } catch (Exception e) {
             e.printStackTrace();
          }
          return fieldValMap;
       }
     
    }

    3.请求参数VO

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class GoodsAddDto {
    
        @Valid
        @NotNull(message = "子商品列表不能为空!")
        @Size(min = 1, message = "子商品列表不能为空!")
        @ApiModelProperty(value = "子商品列表")
        List goodsSubs;
    }
    @RelationValue(message = "起-终位置必须大于1")
    @ApiModel(value = "子商品对象", description = "子商品表")
    public class GoodsSubEntity {
    
    
        @ApiModelProperty(value = "策略状态(0:关闭;1:开启)")
        private Integer targetStatus;
    
    
        @ApiModelProperty(value = "目标范围-起")
        private Integer targetStart;
    
        @ApiModelProperty(value = "目标范围-止")
        private Integer targetEnd;

    }

  • 相关阅读:
    国自然中标越来越难,怎样才能赢在起跑线上?
    Nacos2.1.1 github下载zip太慢解决方法及资源分享
    社招后端21连问(三年工作经验一面)
    Python之前端的学习
    #php的pecl工具#
    动作捕捉系统通过SDK与MATLAB/Simulink通信
    计算机网络面试知识点
    【软件分析第17讲-学习笔记】程序综合 Program Synthesis
    LeetCode216. Combination Sum III
    c语言表达式求值--整型提升
  • 原文地址:https://blog.csdn.net/lvhui321/article/details/126798122