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

如何在Enum注解中返回自定义提示信息?

解决方案

按以下步骤修改代码即可实现需求:

  1. 更新注解的消息模板
    给ValueOfEnumValidation的message设置带占位符的默认值,方便后续替换为实际枚举值:

    String message() default "请选择合法的枚举值,可选值为:{allowedValues}";
    
  2. 修改校验器生成自定义错误消息
    在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;
      }
    }
    
  3. (可选)适配全局异常处理器
    如果项目用了全局异常统一处理,确保处理器能正确提取自定义错误消息。示例代码:

    @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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:24:16