Spring Boot中默认带了error的映射,但是这个错误页面显示给用户并不是很友好。
统一异常处理
通过使用@ControllerAdvice定义统一异常处理的类,而不是在每个Controller中逐个定义。
@ExceptionHandler用来定义函数针对的函数类型,最后将Exception对象和请求URL映射到URL中。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14
 | @ControllerAdvice class ExceptionTranslator {     public static final String DEFAULT_ERROR_VIEW = "error";     @ExceptionHandler(value = Exception.class)     public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {         ModelAndView mav = new ModelAndView();         mav.addObject("exception", e);         mav.addObject("url", req.getRequestURL());         mav.setViewName(DEFAULT_ERROR_VIEW);         return mav;     } }
 | 
实现error.html页面展示
在templates目录下创建error.html。
例如:
| 1 2 3 4 5 6 7 8 9 10 11 12
 | <!DOCTYPE html>   <html>   <head lang="en">       <meta charset="UTF-8" />     <title>统一异常处理</title> </head>   <body>       <h1>Error Handler</h1>     <div th:text="${url}"></div>     <div th:text="${exception.message}"></div> </body>   </html>
 | 
返回使用Json格式
只需在@ExceptionHandler之后加入@ResponseBody,就能让处理函数return的内容转换为JSON格式
创建一个JSON返回对象,如:
| 1 2 3 4 5 6 7 8 9 10 11
 | public class ErrorDTO implements Serializable {     private static final long serialVersionUID = 1L;     private final String message;     private final String description;     private List<FieldErrorDTO> fieldErrors;     //getter和setter省略 }
 | 
可以为指定的Exception添加异常处理
| 1 2 3 4 5 6
 | @ExceptionHandler(ConcurrencyFailureException.class)   @ResponseStatus(HttpStatus.CONFLICT)   @ResponseBody   public ErrorDTO processConcurencyError(ConcurrencyFailureException ex) {       return new ErrorDTO(ErrorConstants.ERR_CONCURRENCY_FAILURE);   }
 | 
ErrorConstants.ERR_CONCURRENCY_FAILURE 是定义的一个异常信息。