0

我在 org.springframework.web.client.RestClientException 中收到以下错误:使用 rest 模板时 java.util.HashMap 没有 HttpMessageConverter。有谁知道出了什么问题?

使用 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)
4

2 回答 2

0

RestTemplate在非 Spring 环境中使用 Spring 的 Web 客户端(至少,您的示例演示了您以标准 Java 方式运行此测试)。

如果您启动一个 Spring 应用程序,它会自行配置大部分配置,包括添加转换器(包中的默认转换器org.springframework.http.converter.*:ByteArrayHttpMessageConverter、StringHttpMessageConverter、ResourceHttpMessageConverter、AllEncompassingHttpMessageConverter、MappingJackson2XmlHttpMessageConverter、MappingJackson2HttpMessageConverter)。最后一个 - 对于您的情况,RestTemplate 使用内部杰克逊进行转换。

因此,如果您想使用您的示例,只需添加特定的转换器。

更简单的方法 - 添加杰克逊库并手动转换:

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

strPayloadRestTempate通话中使用。

或者只是将您的应用程序作为 Spring 应用程序启动。

于 2020-01-08T09:16:24.403 回答
0

将应用程序作为 Spring one 运行,并使用下面的代码进行转换。我还必须将 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");
    }
于 2020-01-09T16:33:50.217 回答