在restTemplate.exchange期间如何从字符串返回特定对象?

时间:2019-09-04 18:32:05

标签: java spring spring-boot resttemplate

我的目标是创建一个Rest Controller,它将返回一个对象(我们称它为Car)。该Rest Controller正在调用其他Rest API (使用设置令牌并被授权进行调用所需的标头)来从不同的端点获取不同的数据以进行混合。就像您向特斯拉询问约2种不同的汽车模型来创建一辆新的疯狂汽车一样!

问题是,另一个API给我一个看起来像{"Name":"automobile2.0","MotorSize":"v12","Color":"Grey","Weight":"2000kg","Year":"2012"}的对象(实际上,我接收28个不同类型的字段,它们是整数,字符串,字符串数组,嵌套的json,...但是我只想保留3个)。而且我找不到使用 RestTemplate Spring Framework 将其转换为我的Car对象的方法。

此外,如果我能找到一种类似的方式来接收列表,那将是完美的选择。

不幸的是,我已经尝试使用getForObject或getForEntity,因为我需要一个无法使用的标头。

我以前是通过接收String来完成此操作的,然后使用Genson和转换器对其进行反序列化,但这似乎并不是最佳解决方案。

所以现在这是我的代码,首先是我想要的Car类:

public class Car {
  @JsonProperty("Name")
  private String carName;
  @JsonProperty("MotorSize")
  private String motorSize;
  @JsonProperty("Color")
  private String color;
}

以及我用来进行Rest API调用的方法:

public Car getCar() {
  UriComponents uriComponents = 
  UriComponentsBuilder.fromUriString(this.myUrl).build();
  HttpHeaders headers = setHeaders(true);  //a private method wich set the header
  HttpEntity<String> request = new HttpEntity<String>(null, headers); //I don't need a body but I do need a header
  ResponseEntity<Car> response = this.restTemplate.exchange(uriComponents.toUriString(), HttpMethod.GET, request, new ParameterizedTypeReference<Car>() {});
  return response.getBody();
}

我知道我的电话正在工作,因为如果这样做:

ResponseEntity<String> response = this.restTemplate.exchange(uriComponents.toUriString(), HttpMethod.GET, request, String.class);

要替换响应,我得到了{“ CarName”:“ automobile2.0”,“ MotorSize”:“ v12”,“ Color”:“ Grey”}作为response.getBody(),这就是我想要的但作为字符串,格式错误。

我期望从getCar()收到的是一辆像这样的车:

{
   "carName": "automobile2.0",
   "motorSize": "v12",
   "color": " "grey",
}

接下来我的控制器(如ResponseEntity(myCar,HttpStatus.OK))将返回哪个

但是当我尝试使用Postman控制器时,我只会收到:

{
   "carName": null,
   "motorSize": null,
   "color": " null,
}

任何人都知道如何从restTemplate.exchange(...)获取我的汽车,这对我来说将是极大的荣幸!

谢谢大家

3 个答案:

答案 0 :(得分:0)

您可以尝试添加Produces = MediaType.APPLICATION_JSON_VALUE并使用json格式化程序将您的字符串转换为JSON。

答案 1 :(得分:0)

转换为Car类型时,可能没有成功,因为从其余调用(即“ Weight”和“ Year”)收到的JSON响应中的属性未知。因此,首先让杰克逊了解您不关心其他任何属性,然后再像在Car类中提到的那样:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Car{

除了不需要将Car封装在ParameterizedTypeReference中之外,还可以像这样使用它:

ResponseEntity<Car> response = this.restTemplate.exchange(uriComponents.toUriString(), HttpMethod.GET, request, Car.class);

当您的对象包含泛型引用时需要包装,在这种情况下,这种引用会在运行时删除,这是简单的类,所有类型都已修复。

希望这会有所帮助。

答案 2 :(得分:0)

只是发现了问题...正如我们之前使用Genson一样,JsonProperty批注仍然是Genson的批注...所以只需替换Jackson的导入即可解决它...