Spring RestTemplate自定义POJO接收JSON返回空值问题排查
问题根源
Spring RestTemplate默认使用Jackson进行JSON反序列化,而Jackson对POJO有两个核心要求:
- 类必须拥有公共无参构造函数(用于实例化对象)
- 字段需要对应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
相关产品推荐
相关产品推荐

