Ошибка в org.springframework.web.client.RestClientException: нет HttpMessageConverter для java.util.HashMap
Я получаю следующую ошибку в org.springframework.web.client.RestClientException: Нет HttpMessageConverter для java.util.HashMap при использовании шаблона отдыха. Кто-нибудь знает, что не так?
Использование java 1.8, spring 5.2.2, commons-logging 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 ответа
Запустите приложение как Spring и выполните преобразование, используя приведенный ниже код. Мне также пришлось включить в свой проект библиотеки jackson-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");
}
Вы используете веб-клиент Spring RestTemplate
в среде, отличной от Spring (по крайней мере, ваш пример демонстрирует, что вы запускаете этот тест стандартным способом Java).
Если вы запускаете приложение Spring, оно требует большей части настройки, включая добавление конвертеров (конвертеры по умолчанию из пакета org.springframework.http.converter.*
: ByteArrayHttpMessageConverter, StringHttpMessageConverter, ResourceHttpMessageConverter, AllEncompassingHttpMessageConverter, MappingJackson2XmlHttpMessageConverter, MappingJackson2HttpMessageConverter). И последнее - для вашего случая RestTemplate использует внутренний Джексон для преобразования.
Итак, если вы хотите использовать свой образец, просто добавьте конкретный конвертер.
Более простой способ - добавить библиотеку Джексона и конвертировать вручную:
var mapper = ObjectMapper();
var strPayload = mapper.writeValueAsString(payload);
И использовать strPayload
в RestTempate
звонки.
Или просто запустите свое приложение как Spring.