带有 ParameterizedTypeReference 的 Spring WebClient 不起作用

k.k*_*lev 4 java spring jackson spring-boot spring-webclient

我有一个 Spring Boot 应用程序,我正在使用 WebClient 向 API 发出请求,该 API 返回以下格式,其中{"results": {...}}字段中的对象results可以采用多种不同的格式。我创建了以下类来存储 API 响应。

@Data
@Jacksonized
@Builder
public class ApiResponse<T> {
    private T results;
}
Run Code Online (Sandbox Code Playgroud)

当我调用以下方法时:

public MyResClass makeApiCall(String URI) {
    ApiResponse<MyResClass> response = webClient.get()
                    .uri(URI)
                    .accept(MediaType.APPLICATION_JSON)
                    .retrieve()
                    .bodyToMono(new ParameterizedTypeReference<ApiResponse<MyResClass>>() {})
                    .block();

    return response.getResults();
}
Run Code Online (Sandbox Code Playgroud)

抛出ajava.lang.ClassCastException并显示以下消息:“java.util.LinkedHashMap 类无法转换为 MyResClass 类”

Dom*_*lio 8

删除@Builder@Jacksonized注释并重复测试,没有它们似乎工作正常。

PS 请小心调用block(),如果此代码碰巧在非阻塞线程上执行,则可能会引发各种错误!

  • “PS 使用 block() 是非常糟糕的”。这实际上取决于您在哪里使用此网络客户端。当然,如果它是 webflux 反应流的一部分,那就不好了,如果你在阻塞应用程序中只使用 webclient,因为它有很好的功能,那么阻塞是完全没问题的。这甚至是(至少其中一个)构建 webflux 的人推荐的开始使用 webflux 的方法。 (4认同)
  • 是的,就是这样。我以为我需要这些注释才能与 Jackson 一起使用,但这种方式工作得很好。 (2认同)