共计 1287 个字符,预计需要花费 4 分钟才能阅读完成。
为了程序返回数据敌对,返回给前端的数据信息是可读的,往往会思考将异样进行封装或者组织为结构化返回。
基于 Spring Boot 体系,本来曾经提供了一些形式实现,咱们明天次要聊的也是基于 Spring Boot 去解决上述问题。
@ExceptionHandler
@ExceptionHandler 能够作为对立拦挡异样形式,对于指定的异样依照你想的形式自在组装返回的数据信息和构造。自由度很高, 这里须要留神的一点,往往大家会在这里就间接通过 response 对象返回响应后果,从而导致 ResponseBodyAdvice、HandlerInterceptor 之类的后续解决不再触发。 所以在应用该形式时,尽可能不间接应用 response.write 形式返回,而是应用对立的数据结构作为解决返回值。
// 举荐
@ResponseStatus(value = HttpStatus.OK)
@ExceptionHandler(value = ConstraintViolationException.class)
@ResponseBody
public Resp<Void> onBadMethodArgumentTypeMismatchException(ConstraintViolationException e) {return Resp.badRequest(e.getConstraintViolations().stream().findFirst().get().getMessage());
}
// 不举荐
@ExceptionHandler(Exception.class)
public void exception(Exception e, HttpServletResponse response) throws IOException {response.setContentType("application/json;charset=UTF-8");
log.error("零碎异样:", e);
response.getWriter().write($.json.toJsonString(Resp.customize(RpcResult.SERVER_ERROR, "服务器异样,请稍后再试"));
}
ErrorController
Spring Boot 在产生异样的时候,如果没有异样捕获器存在,会默认调用 /error 接口 (能够通过 server.error.path 批改),相似写接口一样,对异样进行捕获解决。
该形式优先级上会弱一点,但也是一种好形式,还能够本人实现通过配置形式解决异样,能够参考:Dew。
课外拓展
执行优先级阐明
1、HandlerInterceptor.preHandle()
2、业务办法
3、@ExceptionHandler
4、ResponseBodyAdvice.supports()
5、ResponseBodyAdvice.beforeBodyWrite()
6、HandlerInterceptor.postHandle()
7、HandlerInterceptor.afterCompletion()
正文完