Spring MVC之——全局异常处理

方式1:实现HandlerExceptionResolver接口

不推荐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class HandlerExceptionResolverImpl implements HandlerExceptionResolver {


// 全局异常操作
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 日志
Logger logger = LoggerUtil.getLogger(ex.getClass());
logger.info(ex.getMessage());
// System.out.println("自定义异常处理");
// HandlerException handlerException = null;
//
// //如果抛出的是系统自定义异常则直接转换
// if(ex instanceof HandlerException){
// handlerException = (HandlerException)ex;
// }else{
// //如果抛出的不是系统自定义异常则重新构造一个系统错误异常。
// handlerException = new HandlerException("未知错误,请与管理员联系!");
// }

/* 使用response返回 */
response.setStatus(404); //设置状态码
response.setContentType("application/json; charset=utf-8"); //设置ContentType
response.setCharacterEncoding("UTF-8"); //避免乱码
response.setHeader("Cache-Control", "no-cache, must-revalidate");
try {
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(ResponseMsg.fail.setMsg("未知错误,请联系管理员!"));
response.getWriter().write(s);
} catch (IOException e) {
logger.error("与客户端通讯异常:"+ e.getMessage(), e);
}
return null;
}
}

方式二:使用注解方式

1
2
3
4
5
6
7
8
9
10
// 全局contoller抛出的异常处理
// 用于定义全局组件
@ControllerAdvice
public class HandlerExectionResponse {
@ExceptionHandler(value = HandlerException.class)
@ResponseBody
public ResponseMsg jsonExceptionHandler(HttpServletRequest request, HandlerException e) {
return ResponseMsg.fail.setMsg(e.getMessage());
}
}