首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring 5 Reactive中的HTTP响应异常处理

Spring 5 Reactive中的HTTP响应异常处理
EN

Stack Overflow用户
提问于 2018-04-04 18:13:06
回答 2查看 24.9K关注 0票数 15

我正在使用Spring Boot2和Spring5和WebFlux reactive starter开发一些反应式微服务。

我面临以下问题:我想要处理调用另一个REST服务时收到的所有HTTP状态,并在收到一些糟糕的HTTP状态时抛出异常。例如,当我调用一个端点并收到404HTTP状态时,我想抛出一个异常,该异常将在某个ExceptionHandler类中处理,就像在Spring4中使用@ControllerAdvice时一样。

这样做的正确方法是什么?希望能收到一些好的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-04 19:29:33

这可以通过两个独立的部分来解决。

如何将WebClient收到的HTTP404响应转换为自定义异常

使用WebClient时,您可以从远程服务接收HTTP404响应。默认情况下,所有4xx5xx客户端响应都将转换为WebClientResponseException。因此,您可以直接在WebFlux应用程序中处理这些异常。

如果您只想将404个响应转换为自定义异常,您可以执行以下操作:

代码语言:javascript
复制
WebClient webClient = //...
webClient.get().uri("/persons/1")
  .retrieve()
  .onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
                        clientResponse -> Mono.error(new MyCustomException()))
  .bodyToMono(...);

这显然是基于每个客户端调用完成的。

您可以通过一种更具可重用性的方式实现同样的效果,您可以在WebClient实例上一次性设置ExchangeFilterFunction,如下所示:

代码语言:javascript
复制
WebClient.builder().filter(myExchangeFilterFunction)...

如何处理WebFlux应用程序中的自定义异常

使用带有注释的Spring WebFlux,您可以使用带有@ExceptionHandler注释的方法来处理异常(请参阅Spring Framework reference documentation)。

注意:使用WebExceptionHandler是可能的,但它的级别非常低,因为您在那里没有高级支持:您需要手动编写带有buffers的响应,而不支持任何序列化。

票数 15
EN

Stack Overflow用户

发布于 2018-04-04 18:37:12

我想你要找的是为reference检查WebFluxResponseStatusExceptionHandler

在WebFilter中,可以使用WebExceptionHandler来处理来自WebFilter链和目标WebHandler的异常。在使用WebFlux配置时,注册WebExceptionHandler就像将其声明为Spring bean一样简单,并可选择通过bean声明中的@Order或通过实现Order来表示优先级。

This example可能会有所帮助,但我自己还没有尝试过。

代码语言:javascript
复制
@Component
@Order(-2)
class RestWebExceptionHandler implements WebExceptionHandler{

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        if (ex instanceof PostNotFoundException) {
            exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);

            // marks the response as complete and forbids writing to it
            return exchange.getResponse().setComplete();
        }
        return Mono.error(ex);
    }
}

class PostNotFoundException extends RuntimeException {
    PostNotFoundException(String id) {
        super("Post:" + id + " is not found.");
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49648435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档