Spring Boot Controller返回JSON为空结构[{},{}]的原因排查
问题原因及解决方案
核心原因
你的Student实体类所有字段均为**私有(private)**修饰,而Spring Boot默认依赖Jackson进行JSON序列化时,默认仅能访问类的公共(public)getter方法或公共字段。由于未为私有字段提供对应的getter方法,Jackson无法读取字段值,因此序列化后输出空对象{}。
另外,重写toString()方法无效,因为JSON序列化逻辑依赖字段访问权限或getter方法,与toString()的实现无关。
解决方案
以下是几种可行的修复方式:
1. 手动添加字段getter方法
修改Student类,为每个私有字段添加对应的getter:
package com.training.casapp.entity; import org.springframework.data.cassandra.core.cql.PrimaryKeyType; import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn; import org.springframework.data.cassandra.core.mapping.Table; @Table("student") public class Student { @PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED) private Integer student_id; @Column private String student_city; @Column private Integer student_fees; @Column private String student_name; @Column private Long student_phone; // 为每个字段添加getter方法 public Integer getStudent_id() { return student_id; } public String getStudent_city() { return student_city; } public Integer getStudent_fees() { return student_fees; } public String getStudent_name() { return student_name; } public Long getStudent_phone() { return student_phone; } }
2. 使用Lombok简化代码(推荐)
若项目已引入Lombok依赖,可使用@Data注解自动生成getter、setter、toString等方法,简化代码编写:
首先确保Maven的pom.xml中添加Lombok依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
然后修改Student类:
package com.training.casapp.entity; import lombok.Data; import org.springframework.data.cassandra.core.cql.PrimaryKeyType; import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn; import org.springframework.data.cassandra.core.mapping.Table; @Data @Table("student") public class Student { @PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED) private Integer student_id; @Column private String student_city; @Column private Integer student_fees; @Column private String student_name; @Column private Long student_phone; }
3. 配置Jackson允许访问私有字段(不推荐)
可通过配置Jackson模块直接访问私有字段,但该方式会破坏类的封装性,不建议生产环境使用:
创建Jackson配置类:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonAutoDetect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); return mapper; } }
验证修改
重启Spring Boot应用后,再次访问http://localhost:8081/casapp/studentslist,即可获取包含学生字段数据的正常JSON响应。
内容的提问来源于stack exchange,提问作者javadeveloper
相关产品推荐
相关产品推荐

