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

Spring Boot中如何基于ErrorController实现自定义错误信息?

Spring Boot数据校验场景返回自定义错误信息的实现思路

1. 自定义异常+全局异常处理器

这是业务场景中最常用的方案,适合逻辑层数据校验不通过的情况:

  • 定义带错误码和消息的自定义异常:
    public class InvalidDataException extends RuntimeException {
        private int code;
        private String message;
    
        public InvalidDataException(int code, String message) {
            this.code = code;
            this.message = message;
        }
    
        public int getCode() { return code; }
        public String getMessage() { return message; }
    }
    
  • 编写全局异常处理器,捕获自定义异常并返回结构化响应:
    @RestControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(InvalidDataException.class)
        public ResponseEntity<Map<String, Object>> handleInvalidData(InvalidDataException e) {
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("code", e.getCode());
            errorResponse.put("message", e.getMessage());
            return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
        }
    }
    
  • 业务逻辑中数据校验不通过时抛出异常:
    if(user.getAge() < 18) {
        throw new InvalidDataException(400, "用户年龄需大于等于18岁");
    }
    

2. 扩展现有CustomErrorController,读取自定义请求属性

基于已有的错误控制器,通过请求属性传递自定义错误信息:

  • 修改CustomErrorController,从request中读取自定义信息并返回对应视图:
    @Controller
    public class CustomErrorController implements ErrorController {
        @RequestMapping("/error")
        public ModelAndView springWebErrors(HttpServletRequest request) {
            ModelAndView mav = new ModelAndView();
            String customErrorMsg = (String) request.getAttribute("customErrorMsg");
            
            if (customErrorMsg != null) {
                mav.addObject("errorMsg", customErrorMsg);
                mav.setViewName("customErrorPage"); // 自定义错误页面
            } else {
                mav.setViewName("springWebErrorPage"); // 原有默认错误页面
            }
            return mav;
        }
    }
    
  • 数据校验不通过时,将错误信息存入request并转发到/error路径:
    request.setAttribute("customErrorMsg", "提交的数据格式不符合要求,请检查后重试");
    request.getRequestDispatcher("/error").forward(request, response);
    

3. Spring Validation框架结合自定义错误消息

适合接口参数校验场景,直接在接口层处理错误:

  • 给表单/参数类添加校验注解并指定自定义消息:
    public class UserForm {
        @NotBlank(message = "用户名不能为空")
        @Length(min = 3, max = 10, message = "用户名长度需在3-10位之间")
        private String username;
    
        @Min(value = 18, message = "年龄不能小于18岁")
        private Integer age;
    
        // getters & setters
    }
    
  • 接口方法中通过BindingResult获取错误信息并返回:
    @RestController
    public class UserController {
        @PostMapping("/user")
        public ResponseEntity<?> addUser(@Valid @RequestBody UserForm form, BindingResult result) {
            if (result.hasErrors()) {
                List<String> errorList = result.getAllErrors()
                        .stream()
                        .map(error -> error.getDefaultMessage())
                        .collect(Collectors.toList());
                return ResponseEntity.badRequest().body(Map.of("errors", errorList));
            }
            // 业务处理逻辑
            return ResponseEntity.ok("用户创建成功");
        }
    }
    

4. 自定义ErrorAttributes扩展错误信息

通过替换Spring Boot默认的ErrorAttributes,统一自定义错误数据结构:

  • 自定义ErrorAttributes类:
    @Component
    public class CustomErrorAttributes extends DefaultErrorAttributes {
        @Override
        public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
            Map<String, Object> attributes = super.getErrorAttributes(webRequest, options);
            String customMsg = (String) webRequest.getAttribute("customErrorMsg", RequestAttributes.SCOPE_REQUEST);
            if (customMsg != null) {
                attributes.put("custom_message", customMsg);
            }
            attributes.put("error", "请求异常"); // 修改默认错误描述
            return attributes;
        }
    }
    
  • 在CustomErrorController中注入ErrorAttributes,获取自定义信息返回:
    @Controller
    public class CustomErrorController implements ErrorController {
        private final ErrorAttributes errorAttributes;
    
        public CustomErrorController(ErrorAttributes errorAttributes) {
            this.errorAttributes = errorAttributes;
        }
    
        @RequestMapping("/error")
        @ResponseBody
        public Map<String, Object> handleError(HttpServletRequest request) {
            WebRequest webRequest = new ServletWebRequest(request);
            return errorAttributes.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults());
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:50:24