枚举约束验证:如何在错误提示中展示所有枚举成员
解决枚举校验错误提示显示所有枚举成员的问题
步骤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
相关产品推荐
相关产品推荐

