Spring WebClient 未处理 JSON 内容

Spring WebClient not processing JSON content

我有一个应用程序使用 WebClient 从 ComicVine 获取 JSON 数据,如下所示:

WebClient client = WebClient.builder()
  .baseUrl(url)
  .defaultHeaders(
    headers -> {
      headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
      headers.add(HttpHeaders.USER_AGENT, "ComiXed/0.7");
    })
  .build();

Mono<ComicVineIssuesQueryResponse> request =
  client
    .get()
    .uri(url)
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(ComicVineIssuesQueryResponse.class);

ComicVineIssuesQueryResponse response = request.block();

有一段时间这奏效了。但是,突然间,它在执行时抛出以下根异常:

Caused by: org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/json' not supported for bodyType=org.comixed.scrapers.comicvine.model.ComicVineIssuesQueryResponse
    at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders(BodyExtractors.java:201)

我不确定为什么它突然无法处理 JSON 数据。我的单元测试明确返回 JSON 数据并正确设置内容类型:

private MockWebServer comicVineServer;

this.comicVineServer.enqueue(
  new MockResponse()
    .setBody(TEST_GOOD_BODY)
    .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE));

知道为什么会这样吗?它发生在多个 类 中,它们对 WebClient 和测试使用相同的设置。

经过一些挖掘,我添加了以下代码以将 JSON 作为字符串获取,然后使用 ObjectMapper 将其转换为目标类型:

Mono<String> request =
  client
    .get()
    .uri(url)
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(String.class);

String value = request.block();
ObjectMapper mapper = new ObjectMapper();
ComicVineIssuesQueryResponse response = mapper.readValue(value, ComicVineIssuesQueryResponse.class);

这很快暴露了潜在的问题,即响应中的两个实例变量被注释为相同的 JSON 字段名称。一旦我解决了这个问题,事情又开始正常工作了。

无需调用 block 方法即可将 json 内容解析为字符串。

选项 1) Jackson2Tokenizer

选项 2) 将调用“objectMapper.readValue(..) ..”的代码放入 inside map operator.