我正在做一个项目,直到现在一直在使用org.springframework.web.client.RestTemplate
我最近了解到这个类将被弃用以支持异步 org.springframework.web.reactive.function.client.WebClient
框架。现在我非常赞成这一点,因为我的应用程序在等待来自 RestTemplate (GET) 调用的响应时遇到了长时间的延迟(此时我可能正在做数据库的事情等)。
我现在遇到的问题是,如果我拨打如下电话:
final Mono<String> call = webClient
.get()
.uri("/base/recordPath/1?format=json")
.header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class)
当我进行后续调用时:
System.out.println(call.block());
我得到了预期的输出(填充的 Json 对象的字符串版本)。
但是,如果我将之前的调用更改为(我想做的!):
final Mono<JsonObject> call = webClient
.get()
.uri("/base/recordPath/1?format=json")
.header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(JsonObject.class)
当我这样做时:
System.out.println(call.block());
我只是得到{}
而不是填充的 JsonObject
所以看起来bodyToMono()
没有完成“我”的预期
当我使用 RestTemplate 时,有一种方法可以使用模板注册序列化程序(尽管这不是必需的JsonObject
),这对 WebClient 也有必要吗?如果是这样,你怎么做?
我将不胜感激。
谢谢
账单
注意我不确定这是否有任何相关性,但我正在访问的其余端点确实有 IP 限制,所以如果以某种方式WebClient
更改原始 IP,这可能会产生一些影响。虽然我本以为它会更像4**
某种东西,但我没有看到任何这些!或者可能是媒体类型问题,因为它正在通过 DMZ,例如,监护人可能会将“未经授权的”请求从application/json
更改text/*
为。
可能相关的另一点是,要成功启动应用程序,必须使用以下属性运行它:
spring.main.web-application-type=none
更新
我现在可以运行我的应用程序,尽管不是我想要的!
问题似乎是我需要使用的团队 pom 导入的传递依赖项(作为父 pom)。我现在成功启动了该项目。但仍然发现 json 对象(现在是杰克逊)仍然是空的(如 所报告的object.isEmpty()
)。
我现在的依赖项/版本是:
org.springframework:5.2.8.RELEASE
org.springframework.boot:2.3.3.RELEASE
com.fasterxml.jackson:2.11.2
我知道我正在与父 pom 作斗争,这与我正在尝试做的事情相反,但想知道我真正需要的依赖项是什么