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
相关产品推荐
相关产品推荐

