HC0000

导航

自定义注解

自定义注解

@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():添加约束违规

posted on 2025-07-25 18:16  HC0000  阅读(9)  评论(0)    收藏  举报