当前位置: 首页 > 知识库问答 >
问题:

Spring 5中的HTTP响应异常处理

祁聪
2023-03-14

我正在使用Spring Boot 2和带有WebFlux反应式启动器的Spring 5开发一些反应式微服务。

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

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

共有2个答案

欧桐
2023-03-14

我认为你正在寻找的是WebFLux响应状态ExceptionHandler检查这个以供参考。

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

这个例子可能会有所帮助,但我自己没有尝试过。

@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.");
    }
}
华良平
2023-03-14

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

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

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

WebClient webClient = //...
webClient.get().uri("/persons/1")
  .retrieve()
  .onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
                        clientResponse -> Mono.error(new MyCustomException()))
  .bodyToMono(...);

这显然是在每个客户电话的基础上完成的。

使用ExchangeFilterFunction可以以更可重用的方式实现同样的功能,您可以在WebClient实例上一次性设置该功能,如下所示:

WebClient.builder().filter(myExchangeFilterFunction)...

使用带注释的Spring WebFlux,您可以使用@ExceptionHandler注释的方法处理异常(请参阅Spring框架参考文档)。

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

 类似资料:
  • 问题内容: 我最近公布的我面对这个问题的详细说明,这里的SO。由于我无法发送实际的请求,因此我使用了超时来模拟异步行为。在@Gloopy的帮助下,从模型到视图的数据绑定工作正常 现在,当我使用而不是(在本地测试)时,我可以看到异步请求成功,并且在我的服务中充满了json响应。但是,我的看法没有更新。 在这里更新了Plunkr 问题答案: 这是一个可以满足您需求的Plunk:http ://plnk

  • 我有一个ControllerAdvice类,它处理一组异常。我们还有其他一些例外情况,这些例外情况用注释进行了注释。为了结合这两种方法,我们使用博客文章中描述的技术:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc,即在ControllerAdvice中,我们以以下方式处理一般异常: 它就像一个符咒,但是,使用此技术

  • 我同意在Spring WebFlux中打破非阻塞建议。RestTemplate被列为要弃用的目标,这意味着Webclient将用于阻塞操作。对这个项目来说,审计比绩效更重要。

  • 本文向大家介绍浅谈Spring5 响应式编程,包括了浅谈Spring5 响应式编程的使用技巧和注意事项,需要的朋友参考一下 近年来,响应式编程在开发者社区和客户中很受欢迎,由于其以声明的方式构建应用程序的能力,而不是强制,形成更加敏感和有弹性的应用。Spring 5 将反应系统纳入其核心框架的事实已经显示出向声明式编程的范式转变。 响应式编程管理数据生产者和消费者之间的异步数据流,它们需要以流畅的

  • 我对netty比较陌生,不确定自己做的事情是否正确。我会尽量短一点。如果有任何不清楚的地方,请询问更多信息。 因此,我有一个提供HTTP请求的netty服务器,其中的内容应该是序列化为Json字符串的protobuf消息。 通道管道如下所示: 前两个通道处理程序是标准的netty工具, HttpProtobufServerCodec类似于: 和HttpToProtobufDecoder类似于: 因

  • 我正在尝试用JMeter学习负载测试(非常新)。使用该教程在JMeter网站和另一个youtube教程上构建一个Web测试计划,我创建了一个HTTP GET请求来访问www.google.com/,但是我得到了以下结果: 这是我的要求:链接到图像,因为我还没有10个声誉 环顾四周,其他人正在遇到此问题,但他们的问题是在 250 个用户之后: 响应代码: 非 HTTP 响应代码: java.net.