@RestController返回空JSON对象问题的排查与解决咨询
检查父类字段的序列化权限
BaseEntity中的name字段是包级访问权限,且没有添加@Getter注解或手动编写getter方法。Jackson默认只会序列化public字段或带有getter方法的字段,导致子类(City、Country)继承的name字段无法被序列化,最终返回空对象{}。
解决:给BaseEntity添加Lombok的@Getter注解,或者手动为id和name编写getter方法:@MappedSuperclass @Getter // 添加该注解 public class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(unique=true) String name; @Override public String toString() { return name; } }验证数据库数据有效性
直接执行SQL查询数据库,确认city表的name、country_id字段是否有有效值,country表中是否存在对应country_id的记录且name字段不为空。避免因数据库数据为空导致序列化结果为空。调试Controller返回的对象
在CityController的getCities方法中添加断点或日志,查看cityRepository.findAll()返回的City对象的name、country属性是否实际有值。如果查询出来的对象本身属性为空,需要检查Repository的查询逻辑或数据初始化代码。排查Jackson序列化配置
确认项目中是否自定义了ObjectMapper并设置了严格的序列化规则(比如只序列化public字段),如果有,需要调整配置允许序列化父类的包级字段,或者直接通过添加getter方法来解决。排除Json注解的影响
临时注释掉Country中的@JsonManagedReference和City中的@JsonBackReference注解,测试返回结果是否正常,排除循环引用注解导致的字段序列化被忽略的问题。如果注释后正常,可以重新调整这两个注解的使用,或者改用@JsonIgnore来处理循环引用。
内容的提问来源于stack exchange,提问作者Kifsif

