java 为什么ResponseEntity< Foo>得到的结果与ResponseEntity不同< String>?

hwamh0ep  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(126)

对于我的Java Sping Boot 应用程序(v2.7.12),我使用restTemplate.exchange()执行GET请求,该请求传入正确的url,带有正确头部的HttpEntity和响应类型Profile.class
它将此值分配给ResponseEntity<Profile> response

ResponseEntity<Profile> response = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Profile.class);

现在,当我把它赋给String类型时:ResponseEntity<String> response而不是Profile,response.getBody()返回正确的json主体,以及正确的数据:name: random

<200,{"user":{"username='instagram', full_name='instagram'}

但是,当我将其分配给配置文件类型时:ResponseEntity<Profile> response,它返回正确的json主体,但带有无效数据:name: null

<200,{"user":{"username='null', full_name='null'}

我想做的是将确切的API属性分配给我的Profile模型类,而不需要自己解析JSON的HTML类型。

@JsonIgnoreProperties(ignoreUnknown = false)
public class Profile {
    @JsonProperty("username")
    private String username;
    @JsonProperty("full_name")
    private String full_name;
    @JsonProperty("is_private")
    private boolean is_private;
    @JsonProperty("status")
    private String status;
    @JsonProperty("profile_pic_url")
    private String profile_pic_url;
    @JsonProperty("follower_count")
    private int follower_count;
    @JsonProperty("following_count")
    private int following_count;
    @JsonProperty("biography")
    private String biography;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

这是我的restTemplate:

@Controller
public class WebController {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }

我知道这个问题有一个简单的解决方法。我已经尝试使用JacksonAPI从String类型的响应体中解析JSON,但我希望这是B计划。
我试过改变URL格式,但没有什么区别。标题很好。API本身并没有错。

Profile profile = restTemplate.getForObject(uri, Profile.class)

我尝试使用.getForObject,它以前工作过,但我需要传入头,它不能这样做。

rkttyhzu

rkttyhzu1#

JSON有一个名为user的根元素。您正在尝试反序列化,假设没有根元素。这就是为什么它不起作用,Jackson试图在根上找到Profile类的字段,但它从未找到任何字段,因为它们被 Package 到另一个对象中。
首先,以这种方式配置ObjectMapper(最好将此代码放在@Configuration注解类中:

@Bean
public ObjectMapper objectMapper(ObjectMapper objectMapper) {
    objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
    
    return objectMapper;
}

这将告诉对象Map器允许使用根值进行反序列化。
现在,用@JsonRootName注解Profile类:

@JsonRootName(value = "user")
public class Profile {
    // ...
}

这样,在反序列化时,Jackson将在将JSON反序列化为Profile对象之前解包您的值。

相关问题