统一异常处理
Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。如下:


实现方式
通过@ControllerAdvice和@ExceptionHandler实现处理controller层的异常
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger =
LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseData defaultErrorHandler(HttpServletRequest req,
Exception e) throws Exception {
logger.error("", e);
logger.error("in default exception handler");
ResponseData r = new ResponseData();
r.setMessage(e.getMessage());
if (e instanceof org.springframework.web.servlet.NoHandlerFoundException){
r.setCode(404);
} else {
r.setCode(500);
}
r.setData(null);
r.setStatus(false);
return r;
}
// NullPointerException会由该handler进行处理,即使之前有Exception Handler
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public ResponseData nullPointerErrorHandler(HttpServletRequest req,
Exception e) throws Exception {
logger.error("", e);
logger.error("in null pointer exception handler");
ResponseData r = new ResponseData();
r.setMessage(e.getMessage());
r.setCode(500);
r.setData(null);
r.setStatus(false);
return r;
}
}
public class ResponseData {
private Boolean status = true;
private int code = 200;
private String message;
private Object data;
// ...... 省略 get&set
}
ok测试一下



可以看到NullPointerException已经处理正确处理,但是404的错误并没有走统一异常处理,这个原因是404默认并不是抛出异常的,所以需要在application.properties中进行相关的设置。
# 出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
# 不要为我们工程中的资源文件建立映射
spring.resources.add-mappings=false
再测试下404错误



浙公网安备 33010602011771号