#json #spring #rest #parsing #jackson
#json #весна #rest #синтаксический анализ #джексон
Вопрос:
Мы используем сторонний rest API, который возвращает UUID в качестве ответа на запрос POST. Тип ответа — это application/json
, однако возвращаемый uuid возвращается как обычный текст, а не как JSON "7c49cec7-8ae8-44c8-bc27-866b6efcfe59"
(с кавычками). Я прикрепил MappingJackson2HttpMessageConverter к Spring RestTemplate . Это появляется(Я не уверен), что, поскольку тип содержимого application/json
— это, он пытается проанализировать его как JSON и не может проанализировать его, потому что он не содержит двойных кавычек. Следующее исключение
org.springframework.web.client.RestClientException: Error while extracting response for type [class java.lang.Object] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('d' (code 100)): Expected space separating root-level values; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('d' (code 100)): Expected space separating root-level values
at [Source: (PushbackInputStream); line: 1, column: 3]
Код:
@Test
public void test1() {
String uuid = restTemplate.postForObject("/order", orderDTO, String.class);
assertThat(uuid).isNotNull();
}
Как я могу справиться с этой ситуацией?
Комментарии:
1. Я думаю, вы просто прочитали это как строку
2. Как? Можете ли вы быть более конкретным?
Ответ №1:
Я попробовал следующее решение. Это работает, но это также заставляет преобразование всех других application/json
ответов типа мультимедиа обрабатываться StringHttpMessageConverter
вместо MappingJackson2HttpMessageConverter
. Я добавил перехватчик, который перехватывает ответ перед его преобразованием, а затем изменяет тип содержимого.
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));
messageConverters.add(converter);
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
stringHttpMessageConverter.setSupportedMediaTypes(List.of(MediaType.TEXT_PLAIN));
messageConverters.add(stringHttpMessageConverter);
restTemplate
.getInterceptors()
.add(
(request, body, execution) -> {
ClientHttpResponse response = execution.execute(request, body);
response.getHeaders().setContentType(MediaType.TEXT_PLAIN);
return response;
});
Комментарии:
1. Позже мы убедили провайдера исправить эту ошибку на их стороне.