You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

枚举约束验证:如何在错误提示中展示所有枚举成员

解决枚举校验错误提示显示所有枚举成员的问题

步骤1:修改注解类EnumValidator.java的默认提示信息

添加自定义占位符{allowedValues},用于后续替换为枚举成员列表:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValidatorImpl.class)
public @interface EnumValidator {

    Class<? extends Enum<?>> enumClass();

    // 修改默认提示信息,添加占位符
    String message() default "值无效,允许的枚举值为: {allowedValues}";

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

    Class<? extends Payload>[] payload() default {};

}

步骤2:修改校验实现类EnumValidatorImpl.java

调整泛型适配String类型字段(匹配Person类中status字段的类型),同时在初始化时保存枚举成员列表,在校验不通过时替换占位符:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, String> {

    private List<String> allowableValues;
    private String allowedValuesStr;

    @Override
    public void initialize(EnumValidator constraintAnnotation) {
        // 获取所有枚举成员的name值
        allowableValues = Stream.of(constraintAnnotation.enumClass().getEnumConstants())
                .map(Enum::name)
                .collect(Collectors.toList());
        // 将枚举成员拼接为友好的字符串格式
        allowedValuesStr = String.join(", ", allowableValues);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            // 如需允许null值可返回true,根据业务需求调整
            return false;
        }
        boolean isValid = allowableValues.contains(value);
        if (!isValid) {
            // 禁用默认提示模板,替换自定义占位符
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(
                            context.getDefaultConstraintMessageTemplate()
                            .replace("{allowedValues}", allowedValuesStr))
                    .addConstraintViolation();
        }
        return isValid;
    }
}

效果说明

当输入无效的status值时,错误提示会变为值无效,允许的枚举值为: ACTIVE, IN_ACTIVE,替代原来仅显示枚举类包名的模糊提示。

内容的提问来源于stack exchange,提问作者user3309305

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:16:04