InDictValidator 数据字典校验

637 阅读1分钟
/**
 * 字典表中的code
 * @author zhukangrong
 * @date 2019-11-08
 */
public enum  DictCode {
    /**
     * 目标库类型
     */
    TARGET_LIBRARY_TYPE("TARGET_LIBRARY_TYPE"),

    /**
     * 菜单类型
     */
    MENU_TYPE("MENU_TYPE"),

    /**
     * 目标类型
     */
    TARGET_TYPE("TARGET_TYPE"),

    /**
     * 目标进度
     */
    TARGET_STATUS("TARGET_STATUS"),

    /**
     * 目标是否公开状态
     */
    TARGET_OPEN("TARGET_OPEN"),

    /**
     * 目标季度标签
     */
    TARGET_LABEL("TARGET_LABEL"),

    /**
     * 绩效考核任务类型
     */
    TASK_TYPE("TASK_TYPE"),

    /**
     * 目标查看类型
     */
    TARGET_VIEW_TYPE("TARGET_VIEW_TYPE"),

    /**
     * 任务查看类型
     */
    TASK_VIEW_TYPE("TASK_VIEW_TYPE"),

    /**
     * 任务状态
     */
    TASK_STATUS("TASK_STATUS"),

    /**
     * 上级评分分值
     */
    REVIEW_SCORE("REVIEW_SCORE"),

    /**
     * 自评评分值
     */
    SELF_EVALUATION_SCORE("SELF_EVALUATION_SCORE"),

    /**
     * 目标更新进度值
     */
    UPDATED_STATUS("UPDATED_STATUS");

    private String code;

    DictCode(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}
/**
 * 类型: 1. 目录, 2. 目标
 */
@InDict(code = DictCode.TARGET_LIBRARY_TYPE)
private String type;
import com.megvii.performance.config.InDictValidator;
import com.megvii.performance.pojo.dto.DictCode;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 校验必须是字典表的元素
 * @author zhukangrong
 * @date 2019-11-08
 */
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = InDictValidator.class)
public @interface InDict {
    DictCode code();

    String message() default "字段类型不在字典中!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.megvii.performance.common.annotation.InDict;
import com.megvii.performance.pojo.dto.DictCode;
import com.megvii.performance.pojo.entity.sys.DefDictDO;
import com.megvii.performance.pojo.entity.sys.DefDictRegiseterDO;
import com.megvii.performance.service.sys.DefDictRegiseterService;
import com.megvii.performance.service.sys.DefDictService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 判断字段值在字典范围内的注解
 * @author zhukangrong
 * @date 2019-11-08
 */
public class InDictValidator implements ConstraintValidator<InDict, String> {

    private DictCode dictCode;

    @Autowired
    private DefDictRegiseterService defDictRegiseterService;

    @Autowired
    private DefDictService defDictService;

    @Override
    public void initialize(InDict code) {
        this.dictCode = code.code();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean isValid(String code, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isEmpty(code)){
            return true;
        }
        if (null == defDictRegiseterService.getOne(new LambdaQueryWrapper<DefDictRegiseterDO>().eq(DefDictRegiseterDO::getCode, this.dictCode.getCode()))){
            throw new RuntimeException("字典表中不存在的code!");
        }
        return null != defDictService.getOne(new LambdaQueryWrapper<DefDictDO>()
                .eq(DefDictDO::getPkRegister, this.dictCode.getCode())
                .eq(DefDictDO::getCode, code));
    }
}