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

Java 如何在restTemplate.exchange期间从字符串返回特定对象?,java,spring,spring-boot,resttemplate,Java,Spring,Spring Boot,Resttemplate,我的目标是创建一个Rest控制器,它将返回一个对象(我们称之为汽车)。此Rest控制器正在调用一个其他Rest API(使用设置令牌和授权进行调用所需的头),以从不同端点获取不同的数据,以便混合它们。比如,如果你向特斯拉询问两种不同的车型,以创造一辆新的疯狂汽车 问题是另一个API给了我一个对象,看起来像{“Name”:“automobile2.0”,“MotorSize”:“v12”,“Color”:“Grey”,“Weight”:“2000kg”,“Year”:“2012”}(实际上我接收2

我的目标是创建一个Rest控制器,它将返回一个对象(我们称之为汽车)。此Rest控制器正在调用一个其他Rest API(使用设置令牌和授权进行调用所需的头),以从不同端点获取不同的数据,以便混合它们。比如,如果你向特斯拉询问两种不同的车型,以创造一辆新的疯狂汽车

问题是另一个API给了我一个对象,看起来像
{“Name”:“automobile2.0”,“MotorSize”:“v12”,“Color”:“Grey”,“Weight”:“2000kg”,“Year”:“2012”}
(实际上我接收28个不同类型的字段,int、string、string数组、嵌套的json等等,但我只想保留其中的3个)。我找不到方法使用restemplateSpring Framework将其转换为我的Car对象

此外,如果我能找到一个类似的方式来接收列表,它将是完美的

我已经尝试过使用getForObject或getForEntity,不幸的是,因为我需要一个标题,所以无法使用它

我以前是通过接收一个字符串,然后用Genson和转换器对其进行反序列化来实现的,但这似乎不是最好的解决方案

这是我的代码,首先是我想要的汽车等级:

公车{
@JsonProperty(“名称”)
私弦肉桂;
@JsonProperty(“MotorSize”)
私人字符串大小;
@JsonProperty(“颜色”)
私有字符串颜色;
}
以及我用于执行Rest API调用的方法:

公共汽车getCar(){
UriComponents UriComponents=
UriComponentsBuilder.FromUristing(this.myUrl.build();
HttpHeaders=setHeaders(true);//设置头的私有方法
HttpEntity request=newhttpentity(null,headers);//我不需要正文,但我需要一个标头
ResponseEntity response=this.restTemplate.exchange(uriComponents.toUriString(),HttpMethod.GET,request,new ParameterizedTypeReference(){});
返回response.getBody();
}
我知道我的电话正常工作,因为如果我这样做:

ResponseEntity response=this.restemplate.exchange(uriComponents.toUriString(),HttpMethod.GET,request,String.class);
为了替换响应,我将{“CarName”:“automobile2.0”,“MotorSize”:“v12”,“Color”:“Grey”}作为response.getBody(),这是我想要的,但作为字符串,所以格式错误

我期望从getCar()收到的是一辆类似于:

{
“卡纳姆”:“automobile2.0”,
“motorSize”:“v12”,
“颜色”:“灰色”,
}
接下来由我的控制器返回,比如ResponseEntity(myCar,HttpStatus.OK)

但当我与邮递员一起尝试控制器时,我只收到:

{
“carName”:空,
“motorSize”:空,
“颜色”:“空,
}
我知道如何从restTemplate获得我的汽车。交换(…)这将是我的一大荣幸


谢谢大家,

您可以尝试添加products=MediaType.APPLICATION\u JSON\u值,并使用JSON格式化程序将字符串转换为JSON。

转换为汽车类型时可能会出现故障,因为您在从其余调用收到的JSON响应中有未知属性,即“重量”和“年份”.因此,首先让Jackson明白你不关心任何其他财产,然后你在汽车类中提到:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Car{
除此之外,您不需要在ParameterizedTypeReference中包装汽车,您可以像这样使用它:

ResponseEntity<Car> response = this.restTemplate.exchange(uriComponents.toUriString(), HttpMethod.GET, request, Car.class);
ResponseEntity response=this.restemplate.exchange(uriComponents.toUriString(),HttpMethod.GET,request,Car.class);
当您的对象包含在运行时被删除的泛型引用时,需要进行包装。在本例中,这是一个所有类型都已修复的简单类


希望这有帮助。

刚刚发现了问题…正如我们之前使用Genson一样,JsonProperty注释仍然是来自Genson的注释…因此,只需替换Jackson的导入即可解决问题。

我希望避免使用额外的JSON格式化程序。我使用的是Genson converter,它工作正常,但正如3.1所做的那样,我应该能够告诉交换返回一个特定的对象。我只是不知道条件。谢谢,我只是尝试了一下,但是我仍然得到了所有选定字段的null,你认为lombok注释数据、AllArgsConstructor和NoArgsConstructor可能会破坏什么吗?它们也在我的汽车类中