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
相关产品推荐
相关产品推荐

