Springboot全局异常处理:自定义错误页面与JSON响应

版权申诉
5星 · 超过95%的资源 4 下载量 4 浏览量 更新于2024-09-11 收藏 1.6MB PDF 举报
在Spring Boot应用中,全局化处理异常信息是一个重要的需求,特别是当需要自定义错误页面、根据异常类型返回不同信息以及根据不同请求地址选择返回页面或JSON时。本文将介绍如何通过ControllerAdvice、ErrorController和Filter结合来实现这些功能。 首先,自定义error页面是通过实现ErrorController接口来完成的。Spring Boot提供了`org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController`作为基础类,开发者可以继承这个类并在其中覆盖关键方法,如`getErrorPath()`来指定错误页面的URL路径,`getResponseBody()`用于返回JSON格式的错误信息。以下是一个简单的自定义ErrorController示例: ```java import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyControllerAdvice implements ErrorController { private static final Logger logger = LoggerFactory.getLogger(MyControllerAdvice.class); @Override public String getErrorPath() { return "/my-error-page"; // 自定义的错误页面路径 } @ExceptionHandler(Exception.class) @ResponseBody public ResponseEntity<Map<String, Object>> handleException(Exception ex, HttpServletRequest request) { Map<String, Object> responseModel = new HashMap<>(); responseModel.put("message", "发生错误"); responseModel.put("statusCode", HttpStatus.INTERNAL_SERVER_ERROR.value()); // 根据异常类型或请求信息动态决定是否返回JSON if (shouldReturnJson(request)) { responseModel.put("detail", ex.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseModel); } else { // 返回错误页面 ModelMap model = new ModelMap(); model.addAttribute("error", ex.getMessage()); return new ModelAndView("/my-error-template", model); } } private boolean shouldReturnJson(HttpServletRequest request) { // 逻辑判断条件,例如根据URL路径、请求头等信息判断返回JSON // 这里仅作示例,实际应用中需要根据具体业务场景实现 String requestPath = request.getRequestURI(); return !requestPath.endsWith(".html") || "json".equals(request.getHeader("Accept")); } } ``` 在这个示例中,`handleException`方法负责捕获并处理所有类型的异常。如果满足返回JSON的条件(这里简单地假设非HTML请求或Accept头包含"json"),则返回一个包含错误信息的JSON响应;否则,调用`ModelAndView`来渲染自定义的错误页面。 为了进一步增强灵活性,还可以考虑添加一个Filter来辅助处理异常。Filter可以在请求到达Controller之前检查,根据需要修改请求上下文或决定如何处理异常。这可以用于更精细的逻辑控制,比如记录日志、发送监控警报等。 通过Spring Boot的ControllerAdvice、ErrorController和Filter的协同工作,我们可以实现自定义错误页面、针对不同异常返回定制化的错误信息,并根据请求特性灵活地选择返回页面还是JSON格式。这样既提升了用户体验,也增强了应用程序的健壮性。