看过源码的都知道,所有的框架基本上都会给你提供多条路,多个实现方式。WebFlux 也是一样,除了上一章中的 DefaultErrorAttributes,它还提供了 AbstractErrorWebExceptionHandler。本文说说 AbstractErrorWebExceptionHandler 的用法。
AbstractErrorWebExceptionHandler 看名称就知道,它也是一个抽象类。它提供的功能更多一些,更强大一些!
AbstractErrorWebExceptionHandler 使用代码如下:
@Component @Order(-2) public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler { public GlobalErrorWebExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties, ApplicationContext applicationContext){ super(errorAttributes,resourceProperties,applicationContext); } @Override protected RouterFunction<ServerResponse> getRoutingFunction( ErrorAttributes errorAttributes) { return RouterFunctions.route( RequestPredicates.all(), this::renderErrorResponse); } private Mono<ServerResponse> renderErrorResponse( ServerRequest request) { Map<String, Object> errorPropertiesMap = getErrorAttributes(request, false); // 这里可以自定义处理逻辑 errorPropertiesMap.put("xttblog", "www.xttblog.com"); return ServerResponse.status(HttpStatus.BAD_REQUEST) .contentType(MediaType.APPLICATION_JSON_UTF8) .body(BodyInserters.fromObject(errorPropertiesMap)); } }
注解 @Order(-2) 这个注解。如果没有这个注解,你自定义的这个可能不会生效。因为 WebFlux 有一个默认的实现 DefaultErrorWebExceptionHandler,它的优先级是 @Order(-1)。所以加上 @Order(-2) 是让我们自己的实现拥有更高的优先级。
errorAttributes 对象将是我们在网络异常处理程序的构造函数传递一个的精确副本。理想情况下,这应该是我们自定义的 Error Attributes 类。然后,我们清楚地表明我们想要将所有错误处理请求路由到 renderErrorResponse() 方法。最后,我们获取错误属性并将它们插入服务器响应主体中。
然后,生成一个 JSON 响应,其中包含错误,HTTP 状态和计算机客户端异常消息的详细信息。对于浏览器客户端,它有一个 whitelabel 错误处理程序,它以 HTML 格式呈现相同的数据。其中的响应信息我们可以根据自己的需要进行定制。
参考资料
- Handling Errors in Spring WebFlux
: » 详解 AbstractErrorWebExceptionHandler 类在 WebFlux 全局异常处理中的使用
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/251982.html