一般情况字典数据较少时,使用静态常量类存储;如果有大量的字典数据存在在redis或数据库中,我们想自定义注解并且配置在成员字段上,与数据库中的字典数据进行比较,以下是实现方式。
1. 定义字典注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = {DictStringValidator.class, DictListStringValidator.class})
public @interface Dict {
String dictType() default "";
Class<?>[] groups() default {};
String message() default "字典类型不匹配";
Class<? extends Payload>[] payload() default {};
}
2. 创建校验器,字符类型和字符列表类型
public class DictStringValidator implements ConstraintValidator<Dict, String>, DictValidator {
private Dict dict;
@Override
public void initialize(Dict constraintAnnotation) {
this.dict = constraintAnnotation;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
// 忽略null,由@NotNull校验
return true;
}
// todo 1. 根据dictType从数据库(或redis)查询字典项
// todo 2. 比较字典项和value
return true;
}
}
/**
* 校验列表类型
*/
public class DictListStringValidator implements ConstraintValidator<Dict, List<String>>, DictValidator {
static final Logger logger = LoggerFactory.getLogger(DictListStringValidator.class);
private Dict dict;
@Override
public void initialize(Dict constraintAnnotation) {
this.dict = constraintAnnotation;
}
@Override
public boolean isValid(List<String> value, ConstraintValidatorContext context) {
if (value == null || value.size() == 0) {
return true;
}
// todo 自定义校验逻辑
return true;
}
}
3. 使用注解
/**
* 业务申请
*/
public class BizRequest {
/**
* 公司性质
*/
@NotBlank
@Dict(dictType = "gsxz")
private String gsxz;
... 省略了
}