在Spring WebFlux中处理错误_第1页
在Spring WebFlux中处理错误_第2页
在Spring WebFlux中处理错误_第3页
在Spring WebFlux中处理错误_第4页
在Spring WebFlux中处理错误_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 PAGE 1在Spring WebFlux中处理错误 PAGE 6在Spring WebFlux中处理错误概览在本教程中,我们通过一个实际的例子来看一下可用于处理Spring WebFlux项目中的错误的各种策略。我们还将指出在哪种情况下使用一种策略会比另外一种好,在本文最后将提供所有源码的下载地址。配置实例上一篇文章 HYPERLINK /spring-webflux previous article 中已经提到了maven的配置, 并对 Spring Webflux做了简单的介绍。在这个例子中,我们为一个 RESTful 端点加上一个名为 username 的查询参数,并以“Hello

2、username”作为结果返回。First, lets create a router function that routes the /hello request to a method named handleRequest in the passed-in handler:首先,让我们创建一个路由器函数,将/hello请求路由名为handleRequest的方法中:Beanpublic RouterFunction routeRequest(Handler handler) return RouterFunctions.route(RequestPredicates.GET(/hell

3、o).and(RequestPredicates.accept(MediaType.TEXT_PLAIN), handler:handleRequest);接下来,我们将定义handleRequest()方法,该方法调用sayHello()方法并在ServerResponse主体中包 含/返回其结果的方法:public Mono handleRequest(ServerRequest request) return/.sayHello(request)/.最后,sayHello()是一个简单的实用工具方法,它将“Hello”和 username 连接起来返回。private Mono sayH

4、ello(ServerRequest request) /.return Mono.just(Hello, + request.queryParam(name).get();/.只要用 username 作为我们请求的一部分存在,例如使用“/hello?username=Tonni”访问,我们的端点就可以正确运行。然而,如果我们调用/hello的时候没有使用 username 这个参数,它会抛出一个异常。下面,我们将看看我们在何处如何重新组织我们的代码才能在WebFlux中处理此异常。在函数级别处理错误Mono和Flux API内置了两个关键操作符,用于处理功能级别的错误。让我们简要地探讨它们

5、及其用法。使用 onErrorReturn当出现错误时,我们可以使用 onErrorReturn()来返回一个静态的默认值。public Mono handleRequest(ServerRequest request) return sayHello(request).onErrorReturn(Hello Stranger).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);当 sayHello()抛出异常时,函数就会默认返回Hello Stranger。使用onErrorResume

6、使用onErrorResume处理错误有三种方式:计算动态返回值使用fallback方法 跳转到备份路径public Mono handleRequest(ServerRequest request) return sayHello(request).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s).onErrorResume(e - Mono.just(Error + e.getMessage()捕获,包装和重新抛出错误,例如 作为自定义业务异常让我们看看怎么杨计算一个值:.flatMa

7、p(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);在这里,每当sayHello()抛出异常时,我们将返回一个字符串,该字符串由附加到字符串“Error”的动态获取的错误消息组成。接下来,当错误发生时我们调用 fallback 方法:public Mono handleRequest(ServerRequest request) return sayHello(request).flatMap(s - ServerResponse.ok().contentType(MediaType.TEXT_PLAI

8、N).syncBody(s).onErrorResume(e - sayHelloFallback().flatMap(s -; ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).syncBody(s);在这里,只要sayHello()抛出异常,我们就会调用替代方法sayHelloFallback()。使用onErrorResume()的最后一个选项是捕获,包装和重新抛出错误,例如 作为NameRequiredException:public Mono handleRequest(ServerRequest request) retur

9、n ServerResponse.ok().body(sayHello(request).onErrorResume(e - Mono.error(new NameRequiredException( HttpStatus.BAD_REQUEST,username is required, e), String.class);在这里,只要sayHello()抛出异常,我们就会抛出一个自定义异常,并带有消息:username is required。全局级别的错误处理到目前为止,我们提供的所有示例都在函数级别上处理了错误处理。但是,我们可以选择在全局范围内处理我们的WebFlux错误。 要做到这

10、一点,我们只需要采取两个步骤:自定义全局错误响应属性实现全局错误处理程序我们的处理程序抛出的异常将被自动转换为HTTP状态和JSON错误正文。 要自定义这些,我们可以简单地扩展DefaultErrorAttributes类并覆盖其getErrorAttributes()方法:public class GlobalErrorAttributes extends DefaultErrorAttributesOverridepublic Map getErrorAttributes(ServerRequest request, boolean includeStackTrace) Map map =

11、 super.getErrorAttributes( request, includeStackTrace);map.put(status, HttpStatus.BAD_REQUEST); map.put(message, username is required); return map;在这里,我们希望状态:BAD_REQUEST和消息:username is required在发生异常时作为错误属性的一部分返回。接下来,让我们实现全局错误处理程序。 为此,Spring提供了一个方便的AbstractErrorWebExceptionHandler类,供我们在处理全局错误时进行扩展和实现

12、:Component Order(-2)public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler / constructorsOverrideprotected RouterFunction getRoutingFunction( ErrorAttributes errorAttributes) return RouterFunctions.route( RequestPredicates.all(), this:renderErrorResponse);private Mono r

13、enderErrorResponse( ServerRequest request) Map errorPropertiesMap = getErrorAttributes(request, false);return ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(errorPropertiesMap);在这个例子中,我们将全局错误处理程序的顺序设置为-2。 这是为了给它一个比在Order(-1)注册的DefaultErrorWebExceptionHandler更高的优先级。errorAttributes对象将是我们在Web异常处理程序的构造函数中传递的副本的精确副本。 理想情况下, 这应该是我们自定义的Error Attributes类。然后,我们清楚地说明我们想要将所有错误处理请求路由到renderErrorResponse()方法。最后,我们获取错误属性并将它们插入服务器响应主体中。然后,它会生成一个JSON响应,其中包含错误,HTTP状态和计算机客户端的异常消息的详细

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论