自定义校验注解 @annotation
背景
已有校验注解,不满足需求,自定义校验注释使用。
实现
定义接口 @interface
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 指明自定义注解的实现类
@Constraint(validatedBy = {IsEquipmentTypeStatusImpl.class})
public @interface IsEquipmentTypeStatus {
// 匹配失败提示内容
String message() default "equipmenttype is invalid";
// 校验生效组
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现
public class IsEquipmentTypeStatusImpl implements ConstraintValidator<IsEquipmentTypeStatus, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (StringUtils.isBlank(value)) {
return false;
}
// 这里写自己的校验逻辑即可
StatusManager.Status2[] status = StatusManager.Status2.values();
for (StatusManager.Status2 desc : status) {
if (value.equalsIgnoreCase(desc.getDescription())) {
return true;
}
}
return false;
}
// 测试用的,可以不写
public static void main(String[] args) {
System.out.println(test("耗材1"));
}
// 测试用的,可以不写
public static boolean test(String value) {
int i = 0;
if (StringUtils.isBlank(value)) {
return false;
}
StatusManager.Status2[] status = StatusManager.Status2.values();
for (StatusManager.Status2 desc : status) {
System.out.println(++i);
if (value.equalsIgnoreCase(desc.getDescription())) {
return true;
}
}
return false;
}
}
使用
直接在要校验的字段上引用即可。
@IsEquipmentTypeStatus(message = "设备分类状态不能为空 || 字符输入错误", groups = {Delete.class, Update.class, Add.class})
private String status;