自定义注解
自定义注解
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = NoDuplicatesValidator.class) // 关键:指定验证器
public @interface NoDuplicates {
String message() default "列表中存在重复项";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证器
import com.alibaba.fastjson.JSON;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class NoDuplicatesValidator implements ConstraintValidator<NoDuplicates, List<?>> {
private String message;
@Override
public void initialize(NoDuplicates constraintAnnotation) {
this.message = constraintAnnotation.message();
}
@Override
public boolean isValid(List<?> value, ConstraintValidatorContext context) {
if (value == null || value.isEmpty()) {
return true;
}
Set<String> seen = new HashSet<>();
for (Object item : value) {
String key;
if (item instanceof String) {
key = (String) item;
} else {
key = JSON.toJSONString(item);
}
if (!seen.add(key)) {
// 自定义错误消息,只显示注解中定义的文本
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(message)
.addConstraintViolation();
return false;
}
}
return true;
}
}
1、initialize方法:获取注解中定义的错误消息
2、context.disableDefaultConstraintViolation():禁用默认的约束违规信息
3、context.buildConstraintViolationWithTemplate(message):使用自定义消息模板
4、addConstraintViolation():添加约束违规