You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring RestTemplate自定义POJO接收JSON返回空值问题排查

问题根源

Spring RestTemplate默认使用Jackson进行JSON反序列化,而Jackson对POJO有两个核心要求:

  1. 类必须拥有公共无参构造函数(用于实例化对象)
  2. 字段需要对应getter/setter方法(或通过注解允许直接访问字段)

你提供的所有POJO类(Response、Data、Meta、Payload)既没有定义无参构造函数,也没有添加getter/setter方法,导致Jackson无法正确实例化对象并赋值,最终返回的data和meta字段为null。

解决方案

以下三种方法任选其一即可,推荐前两种:

方法1:手动添加无参构造函数和getter/setter

修改所有POJO类,补充必要的构造函数和访问方法:

public class Response {
    private Data data;
    private Meta meta;

    public Response() {}

    public Data getData() { return data; }
    public void setData(Data data) { this.data = data; }
    public Meta getMeta() { return meta; }
    public void setMeta(Meta meta) { this.meta = meta; }
}

public class Data {
    private double[] scores;

    public Data() {}

    public double[] getScores() { return scores; }
    public void setScores(double[] scores) { this.scores = scores; }
}

public class Meta {
    private String method;
    private String url;
    private Payload payload;
    private String timestamp;
    private double system_latency_ms;
    private String user_agent;

    public Meta() {}

    public String getMethod() { return method; }
    public void setMethod(String method) { this.method = method; }
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    public Payload getPayload() { return payload; }
    public void setPayload(Payload payload) { this.payload = payload; }
    public String getTimestamp() { return timestamp; }
    public void setTimestamp(String timestamp) { this.timestamp = timestamp; }
    public double getSystem_latency_ms() { return system_latency_ms; }
    public void setSystem_latency_ms(double system_latency_ms) { this.system_latency_ms = system_latency_ms; }
    public String getUser_agent() { return user_agent; }
    public void setUser_agent(String user_agent) { this.user_agent = user_agent; }
}

public class Payload {
    private String[] lookup_scores;

    public Payload() {}

    public String[] getLookup_scores() { return lookup_scores; }
    public void setLookup_scores(String[] lookup_scores) { this.lookup_scores = lookup_scores; }
}

方法2:用Lombok简化代码(推荐)

如果项目已引入Lombok依赖,可通过@Data注解自动生成无参构造函数、getter/setter、toString等方法,减少冗余代码:

首先添加Lombok依赖(Maven示例):

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

然后修改POJO类:

import lombok.Data;

@Data
public class Response {
    private Data data;
    private Meta meta;
}

@Data
public class Data {
    private double[] scores;
}

@Data
public class Meta {
    private String method;
    private String url;
    private Payload payload;
    private String timestamp;
    private double system_latency_ms;
    private String user_agent;
}

@Data
public class Payload {
    private String[] lookup_scores; 
}

方法3:用@JsonProperty直接访问字段(不推荐)

若不想添加getter/setter,可在私有字段上添加@JsonProperty注解,允许Jackson直接访问字段,但这种方式会破坏封装性:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Response {
    @JsonProperty
    private Data data;
    @JsonProperty
    private Meta meta;
}

// Data、Meta、Payload类的字段同理添加@JsonProperty注解

修改完成后,重新使用ResponseEntity<Response>接收响应,data和meta字段即可正确赋值。

内容的提问来源于stack exchange,提问作者Atul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:32:54