分三类进行讨论
1.请求404时候,如果配置文件开启了spring.resources.add-mappings=false
,表示不开启默认的资源处理,采用
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter
去处理时候,404异常可以获取到。
可是设置为true时候,404捕捉不到。需要自己
public class NotFoundController implements ErrorController
去写里面方法进行处理,至于具体原因也不清楚为什么,通过测试得知。有知道的人请告知下谢谢。
2.当请求进来时候,service处理时候自定义抛出的异常
3.请求进来时候,服务器错误
第一种代码
@RestController
public class NotFoundController implements ErrorController {
@Override
public String getErrorPath() {
return "/erro";
}
@RequestMapping(value = "/error")
public Object error(HttpServletResponse response, HttpServletRequest request) {
Result result = new Result();
result.setCode(ResultCode.NOT_FOUND).setMessage("接口 [" + request.getRequestURI() + "] 不存在");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(200);
try {
response.getWriter().write(JSON.toJSONString(result));
} catch (IOException e) {
e.printStackTrace();
}
return new ModelAndView();
}
}
第2,3种代码
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);
//统一异常处理
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
exceptionResolvers.add(new HandlerExceptionResolver() {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
Result result = new Result();
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
if (e instanceof ServiceException) {//业务失败的异常,如“账号或密码错误”
result.setCode(ResultCode.FAIL).setMessage(e.getMessage());
logger.error(e.getMessage());
} else {
result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage("接口 [" + request.getRequestURI() + "] 内部错误,请联系管理员");
String message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s",
request.getRequestURI(),
handlerMethod.getBean().getClass().getName(),
handlerMethod.getMethod().getName(),
e.getMessage());
logger.error(message, e);
}
} else {
if (e instanceof NoHandlerFoundException) {
result.setCode(ResultCode.NOT_FOUND).setMessage("接口 [" + request.getRequestURI() + "] 不存在");
} else {
result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage(e.getMessage());
logger.error(e.getMessage(), e);
}
}
responseResult(response, result);
return new ModelAndView();
}
});
}
private void responseResult(HttpServletResponse response, Result result) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(200);
try {
response.getWriter().write(JSON.toJSONString(result));
} catch (IOException ex) {
logger.error(ex.getMessage());
}
}
}