Является ли пользовательский HttpMessageConverter единственным вариантом для этой ошибки? - PullRequest
1 голос
/ 24 марта 2019

Spring загрузочное приложение, где у меня есть универсальный класс ApiCaller для вызова разных URL.Я использую RestTemplate для звонков.Детали для вызова поступают из нашей внутренней базы данных.

 switch (serviceRequest.getMethod()) {
            case "POST":
              response = this.restTemplate.postForEntity(url,serviceRequestBody, Map.class).getBody();
              break;
            case "GET":
              response = this.restTemplate.getForEntity(url,serviceRequestBody, Map.class).getBody();
              break;
            default:
              break;
          }


Как видно, я отправляю responseType как Map.class, который преобразует ответ из API в карту.Он отлично работает API, который возвращает ответ JSON.Тем не менее, он не работает для ресурсов, которые возвращают ответ XML.Ниже приводится исключение:

no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [application/xml]
      at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:110) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]
      at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:932) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]
      at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:916) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:663) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]
      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]
      at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:415) ~[spring-web-4.3.18.RELEASE.jar!/:4.3.18.RELEASE]

Я прошел через несколько подобных проблем и обнаружил, что Custom messageConverter решит эту проблему.Есть ли встроенный HttpMessageConverter, который может справиться с этим?

1 Ответ

1 голос
/ 25 марта 2019

Добавить HttpMessageConverter к RestTemplate объекту для преобразования любого типа ответа

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//converter to process any kind of response, 
converter.setSupportedMediaTypes(Arrays.asList({MediaType.ALL}));         
messageConverters.add(converter);  
restTemplate.setMessageConverters(messageConverters);
...