Rest API отправляет ответ в виде простой строки, однако тип содержимого — «application / json; charset = UTF-8». Как я могу прочитать ответ

#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. Позже мы убедили провайдера исправить эту ошибку на их стороне.