使用RestTemplate获取JSON对象时遇HttpMessageNotReadableException异常排查
问题分析与解决方案
咱们直接说核心问题,你遇到的是Jackson反序列化的两个关键问题,一步步来解决:
1. 内部类的访问权限与实例化问题
错误提示里的no suitable constructor found, can not deserialize from Object value是关键,这是因为你的Address、Attribute、Phone都是private非静态内部类:
- Jackson需要通过反射创建这些类的实例,但private修饰符会挡住外部(包括Jackson序列化器)的访问
- 非静态内部类必须依赖外部类
PoyntBusinessDetails的实例才能创建,Jackson没法自动处理这种依赖关系
修复方式:
把这些内部类改成public static修饰的静态内部类,这样它们就不依赖外部类实例,Jackson也能正常访问构造器:
public class PoyntBusinessDetails { // 原有字段保持不变... // 修改内部类为public static public static class Address { // 字段 + getters/setters } public static class Attribute { // 字段 + getters/setters } public static class Phone { // 字段 + getters/setters } // 原有构造器、getters/setters... }
2. JSON字段与Java类字段不匹配问题
对比你的Java类和API返回的JSON,发现好几处字段名、类型不对应,这也会导致反序列化失败:
- JSON里的
createdAt→ Java类的createdDate - JSON里的
updatedAt→ Java类的updatedDate - JSON里的
activeSince→ Java类的activatedDate - JSON里的
attributes→ Java类的attribute - 另外JSON里的
mockProcessor是布尔值false,但Java类里定义成了String类型,类型不匹配也会报错
修复方式:
用Jackson的@JsonProperty注解映射字段名,同时修正类型不匹配的问题:
public class PoyntBusinessDetails { // 把mockProcessor类型改成boolean,匹配JSON的布尔值 private boolean mockProcessor; // 用@JsonProperty指定对应的JSON字段名 @JsonProperty("createdAt") private String createdDate; @JsonProperty("updatedAt") private String updatedDate; @JsonProperty("activeSince") private String activatedDate; @JsonProperty("attributes") private Attribute attribute; // 其他原有字段保持不变... // 已经改成public static的内部类... }
最后检查点
- 确保所有内部类(Address、Attribute、Phone)都有无参构造器(如果没写带参构造器,Java会自动生成;如果写了带参的,一定要手动加无参构造器)
- 确认所有字段都有对应的getter/setter方法,Jackson默认靠这些方法赋值
这样修改后,RestTemplate的Jackson序列化器就能正确解析API返回的JSON了。
内容的提问来源于stack exchange,提问作者GeekySelene
相关产品推荐
相关产品推荐

