Spring RESTTemplate getForObject 方法不支持返回的内容类型“null”

Posted

技术标签:

【中文标题】Spring RESTTemplate getForObject 方法不支持返回的内容类型“null”【英文标题】:Content type 'null' not supported returned by Spring RESTTemplate getForObject method 【发布时间】:2014-08-21 12:01:57 【问题描述】:

我在 Spring MVC 控制器中有一个简单的 REST 方法,如下所示,其签名为:

@RequestMapping(value="/person/personId", method=RequestMethod.GET) 公共 @ResponseBody 对象 getPerson(@PathVariable("personId") String personId) ...

输出类型为Object,因为此方法返回了几种不同的数据类型。

从 Spring MVC 应用程序中的测试程序调用时,如下所示:

private static void getPerson() 
    logger.info(Rest.class.getName() + ".getPerson() method called."); 

    RestTemplate restTemplate = new RestTemplate();

    Person person = restTemplate.getForObject("http://localhost:8080/Library/rest/person/1", Person.class);   

    ObjectMapper responseMapper = new ObjectMapper(); 
    ...
    

响应为Content type 'null' not supported,调用失败。

谁能告诉我为什么?

当从另一个不使用 Spring 但发出 HTTP GET 请求的应用程序中的测试程序调用时,控制器方法被正确调用并工作。

【问题讨论】:

【参考方案1】:

你可以试试这个:

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(VERSION_CHECK_READ_TIMEOUT);
RestTemplate template = new RestTemplate(requestFactory);
Person person = restTemplate.getForObject("http://localhost:8080/Library/rest/person/1", Person.class);

如果上述方法不起作用,您可以尝试使用Entity 方法,例如:

  RestTemplate restTemplate = new RestTemplate();

  // Prepare acceptable media type
  List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
  acceptableMediaTypes.add(MediaType.APPLICATION_XML); // Set what you need

  // Prepare header
  HttpHeaders headers = new HttpHeaders();
  headers.setAccept(acceptableMediaTypes);
  HttpEntity<Person> entity = new HttpEntity<Person>(headers);

  // Send the request as GET
  try 
      ResponseEntity<PersonList> result = restTemplate.exchange("http://localhost:8080/Library/rest/person/1", HttpMethod.GET, entity, PersonList.class);
      // Add to model
      model.addAttribute("persons", result.getBody().getData());

   catch (Exception e) 
      logger.error(e);
  

有很多useful examples here。

希望能帮到你

【讨论】:

谢谢,但关于第一个,VERSION_CHECK_READ_TIMEOUT 住在哪里?而对于第二个,参数(“”)会引起麻烦。 @MrMorgan 抱歉,请再次检查。 我在Person 类中没有这样的getData() 方法。然而,尽管代码仍然返回不支持的内容类型'null',这很奇怪,因为我已将媒体类型设置为 JSON。 ——

以上是关于Spring RESTTemplate getForObject 方法不支持返回的内容类型“null”的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebClient vs. RestTemplate

Spring的RestTemplate

Spring RestTemplate 专题

Spring Cloud Commons教程Spring RestTemplate作为负载平衡器客户端

Spring/RestTemplate - PUT 实体到服务器

Spring boot restTemplate