如何在Enum注解中返回自定义提示信息?
解决方案
按以下步骤修改代码即可实现需求:
更新注解的消息模板
给ValueOfEnumValidation的message设置带占位符的默认值,方便后续替换为实际枚举值:String message() default "请选择合法的枚举值,可选值为:{allowedValues}";修改校验器生成自定义错误消息
在ValueOfEnumValidator中,先保存注解的消息模板,在校验不通过时替换占位符并生成自定义消息:public class ValueOfEnumValidator implements ConstraintValidator<ValueOfEnumValidation, String> { private List<String> valueList = null; private String messageTemplate; @Override public void initialize(ValueOfEnumValidation constraintAnnotation) { valueList = Arrays.stream(constraintAnnotation.value().getEnumConstants()) .map(Enum::name) .collect(Collectors.toList()); // 保存注解中的消息模板 messageTemplate = constraintAnnotation.message(); } @Override public boolean isValid(String string, ConstraintValidatorContext context) { boolean isValid = valueList.contains(string); if (!isValid) { // 关闭默认错误消息 context.disableDefaultConstraintViolation(); // 替换占位符为枚举值列表 String errorMsg = messageTemplate.replace("{allowedValues}", String.join(", ", valueList)); // 添加自定义错误消息 context.buildConstraintViolationWithTemplate(errorMsg) .addConstraintViolation(); } return isValid; } }(可选)适配全局异常处理器
如果项目用了全局异常统一处理,确保处理器能正确提取自定义错误消息。示例代码:@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, Object>> handleValidationError(MethodArgumentNotValidException ex) { List<String> errors = ex.getBindingResult() .getAllErrors() .stream() .map(error -> error.getDefaultMessage()) .collect(Collectors.toList()); Map<String, Object> result = new HashMap<>(); result.put("code", 400); result.put("errors", errors); return ResponseEntity.badRequest().body(result); } }
最终效果
假设校验的枚举是:
public enum OrderStatus { CREATED, PAID, SHIPPED, COMPLETED }
当输入非法值时,返回的响应会变成:
{ "code": 400, "errors": [ "请选择合法的枚举值,可选值为:CREATED, PAID, SHIPPED, COMPLETED" ] }
内容的提问来源于stack exchange,提问作者Loki
相关产品推荐
相关产品推荐

