为了程序返回数据敌对,返回给前端的数据信息是可读的,往往会思考将异样进行封装或者组织为结构化返回。

基于 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、@ExceptionHandler4、ResponseBodyAdvice.supports()5、ResponseBodyAdvice.beforeBodyWrite()6、HandlerInterceptor.postHandle()7、HandlerInterceptor.afterCompletion()