You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Reactive Spring获取异构JSON响应体的异常问题及解决方案

Reactive Spring 非固定结构第三方接口响应体获取方案

问题背景

使用Reactive Spring处理接口响应时,对接的第三方服务返回的JSON响应结构不固定,无法预先定义DTO完成映射,因此尝试直接将响应转为String类型处理。

测试验证场景

使用SoapUI模拟简易服务,异常请求时返回400状态码,响应内容如下:

{
   "errorCode" :  "code",
   "errorMessage" : "message"
}

初始实现及问题

需求为请求出错时在控制台打印完整响应内容,初始代码如下:

.bodyValue(eventDataDto)
.exchange()
.doOnSuccess((response) -> {
    if (response.rawStatusCode() != HttpStatus.OK.value()) {
        throw new RuntimeException("Sending request failed with status: " + response.rawStatusCode() +
                " with error message: " + response.bodyToMono(String.class));
    }
})
.doOnError((throwable) -> {
    throw new RuntimeException(throwable);
})
.block();

运行后输出如下,无法获取实际响应体内容:

Sending request failed with status: 400 with error message: checkpoint("Body from POST http://localhost:8095/test/ [DefaultClientResponse]")

后续尝试对返回的Mono使用subscribe、map、flatMap操作,仅报错信息中的类类型发生变化,始终无法拿到实际响应内容。

问题原因与解决方案

问题根源是Reactive编程规范中,Mono只有被订阅后才会触发数据流执行、返回实际结果,调整后的代码如下:

.bodyValue(eventDataDto)
.exchange()
.doOnSuccess((response) -> {
    if (response.rawStatusCode() != HttpStatus.OK.value()) {
        Mono<String> bodyMono = response.bodyToMono(String.class);
        bodyMono.subscribe(body -> {
            throw new RuntimeException(
                    "Sending request failed with status: " + response.rawStatusCode() +
                " with error message: " + body);
        });
    }
})
.doOnError((throwable) -> {
    throw new RuntimeException(throwable);
})
.block();

内容的提问来源于stack exchange,提问作者Artur Jarosz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:18:01