Ошибка в org.springframework.web.client.RestClientException: нет HttpMessageConverter для java .util.HashMap - PullRequest
0 голосов
/ 08 января 2020

Я получаю следующую ошибку в org.springframework.web.client.RestClientException: Нет HttpMessageConverter для java .util.HashMap, когда используется шаблон rest. У кого-нибудь есть идеи, что не так?

Использование java 1.8, пружина 5.2.2, регистрация общего доступа 1.2.

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.client.RestTemplate;

public class testapi {
   private static final String API_BASE_URL = "https://xyz/rest/ng";
   private static RestTemplate template = new RestTemplate();

public static void main(String[] args)
   throws Exception {
String token = login();
}

 private static String login() {

       Map<String, Object> payload = new HashMap<>();
       payload.put("loginName", "abc.com");
          payload.put("password", "xyz");
          Map<String, Object> resp = template.postForObject(getUrl("/sessions"), payload, Map.class);
          return (String) resp.get("token");

            }
}

Ошибка

Exception in thread "main" org.springframework.web.client.RestClientException: No HttpMessageConverter for java.util.HashMap
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:964)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:677)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:421)
    at TestFormApis.login(testapis.java:117)
    at TestFormApis.main(testapis.java:61)

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Запустите приложение как Spring и выполните преобразование, используя код ниже. Мне также пришлось включить libs-core-2.2.0-rc1.jar в мой проект.

RestTemplate template = new RestTemplate();
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();


public String login() {

mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM));
       template.getMessageConverters().add(mappingJackson2HttpMessageConverter);

       Map<String, Object> payload = new HashMap<>();
       payload.put("loginName", "xyz");
          payload.put("password", "abc");
Map<String, Object> resp = template.postForObject(getUrl("/abc"), payload, Map.class);
          return (String) resp.get("token");
    }
0 голосов
/ 08 января 2020

Вы используете веб-клиент Spring RestTemplate в среде, отличной от Spring (по крайней мере, ваш пример демонстрирует, что вы запускаете этот тест стандартным Java способом).

Если вы запускаете Spring приложению, он принимает большую часть конфигурации к себе, включая добавление конвертеров (конвертеры по умолчанию из пакета org.springframework.http.converter.*: ByteArrayHttpMessageConverter, StringHttpMessageConverter, ResourceHttpMessageConverter, AllEncompassingHttpMessageConverter, MappingJackson2XmlHttpMessageConessHerverMasterPerverververter). Последнее - для вашего случая RestTemplate использует внутренний Джексон для конвертации.

Итак, если вы хотите использовать ваш пример, просто добавьте указанный c конвертер.

Более простой способ - добавьте библиотеку Джексона и преобразуйте вручную:

var mapper = ObjectMapper();
var strPayload = mapper.writeValueAsString(payload);

И используйте strPayload в RestTempate вызовах.

Или просто запустите приложение как Spring.

...