在Java中异常可以分为Error和Exception,@ControllerAdvice用来处理系统中的Exception,ErrorController处理系统中的Error。
1.ErrorController
当系统出现404或者405等错误信息时,springboot默认的访问路径为/error,所以实现ErrorController并重写
getErrorPath方法
@Controller
public class AppErrorController implements ErrorController{
private static final String ERROR_PATH = "/error";
@Autowired
private ErrorAttributes errorAttributes;
@Override
public String getErrorPath() {
return ERROR_PATH;
}
/* @Autowired
private AppErrorController(ErrorAttributes errorAttributes){
this.errorAttributes = errorAttributes;
}*/
/**
* web页面错误处理
* @param request
* @param response
* @return
*/
@RequestMapping(value = ERROR_PATH,produces = "text/html")
public String errorPageHandler(HttpServletRequest request, HttpServletResponse response){
int status = response.getStatus();
switch (status) {
case 403:
return "403";
case 404:
return "404";
case 500:
return "500";
}
return "index";
}
/**
* 除web页面外的错误处理,如JSON/XML等
*/
@RequestMapping(value = ERROR_PATH)
@ResponseBody
public ApiResponse errorApiHandler(HttpServletRequest request){
RequestAttributes requestAttributes = new ServletRequestAttributes(request);
Map<String, Object> attr = this.errorAttributes.getErrorAttributes(requestAttributes, false);
int status = getStatus(request);
return ApiResponse.ofMessage(status, String.valueOf(attr.getOrDefault("message", "error")));
}
private int getStatus(HttpServletRequest request) {
Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");//固定写法
if (status != null) {
return status;
}
return 500;
}
}
2.ControllerAdvice
ControllerAdvice用来处理发生Exception错误的注解。需要注意的是不能使用try catch 捕获
@ControllerAdvice
public class GlobalExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = {Exception.class,NullPointerException.class})//这里可以写多个异常
public ApiResponse exceptionHandler(HttpServletRequest request, Exception e, HttpServletResponse response){
int status = response.getStatus();
return ApiResponse.ofMessage(status, e.getMessage());
}
}