【问题标题】:Is custom HttpMessageConverter the only option for this error?自定义 HttpMessageConverter 是此错误的唯一选择吗?
【发布时间】:2023-03-08 16:25:02
【问题描述】:

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 转换为地图。它可以正常工作返回 json 响应的 api。但是,它不适用于返回 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]

我遇到了几个类似的问题,发现自定义 messageConverter 可以解决这个问题。有没有内置的 HttpMessageConverter 可以处理这个问题?

【问题讨论】:

  • 你为什么不使用exchange 和标题和httpentity
  • 我创建了一个拦截器来设置标题信息。我做了一个调试,我得到了服务的响应。它在将响应转换为 Map 时给出 .exception
  • 请将媒体类型转换为RestTemplate
  • 对不起,没明白你的意思。能否请您解释一下或提供一个代码示例。

标签: spring spring-boot resttemplate


【解决方案1】:

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);

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2020-07-01
    • 2018-10-30
    • 1970-01-01
    • 2014-09-04
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多