乐趣区

关于java:Spring-Boot-的几种统一处理方式

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

基于 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()
退出移动版