我的目标是创建一个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(...)获取我的汽车,这对我来说将是极大的荣幸!
谢谢大家
答案 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的导入即可解决它...