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.
我有一个应用程序使用 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.