
spring boot 应用连接 mysql 后查询返回空 json 对象(如 [{}, {}, {}]),通常源于实体类字段命名与 lombok 生成的 getter/setter 不匹配,导致 jackson 序列化失败。本文详解根本原因及修复方法。
spring boot 应用连接 mysql 后查询返回空 json 对象(如 [{}, {}, {}]),通常源于实体类字段命名与 lombok 生成的 getter/setter 不匹配,导致 jackson 序列化失败。本文详解根本原因及修复方法。
在你提供的代码中,Hibernate 确实成功执行了 SQL 查询(日志显示 select ... from book),且 books.size() 输出为 4,说明数据已从数据库正确加载到内存中;但最终响应却是多个空对象 {},这不是数据库或 JPA 查询的问题,而是序列化环节失效——Spring MVC 默认使用 Jackson 将 Book 对象转为 JSON,而 Jackson 依赖标准的 JavaBean 规范:即字段名需符合驼峰命名(camelCase),且 getter/setter 方法名必须严格匹配字段名(遵循 getXXX() / setXXX() 命名约定)。
你的 Book 实体类中字段全部采用大驼峰(UpperCamelCase)命名:
private String ISBN; // ❌ 非标准字段名(全大写缩写) private String Name; // ❌ 首字母大写 private String Author; // ❌ 首字母大写 private String Introduction; // ❌ 首字母大写
Lombok 的 @Getter/@Setter 会为其生成类似 getISBN()、getName()、getAuthor() 等方法。但 Jackson 在序列化时,默认按字段名(而非 getter 方法名)推导 JSON 键名,且对不符合 JavaBean 规范的 getter(如 getISBN())存在兼容性问题——尤其当字段名为全大写缩写时,Jackson 可能无法正确识别其对应属性,最终跳过所有字段序列化,输出空对象 {}。
✅ 正确做法是:将所有字段改为标准小驼峰命名(lowerCamelCase),并保持 @Column(name = "...") 显式映射数据库列名:
package com.example.demo.model;
import jakarta.persistence.*;
import lombok.Data;
@Data // 推荐使用 @Data 替代分散的 @Getter/@Setter,更简洁
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "isbn") // 映射数据库字段 isbn
private String isbn; // ✅ 小驼峰:isbn(不是 ISBN)
@Column(name = "name")
private String name; // ✅ 小驼峰:name(不是 Name)
@Column(name = "author")
private String author; // ✅ 小驼峰:author(不是 Author)
@Column(name = "introduction")
private String introduction; // ✅ 小驼峰:introduction(不是 Introduction)
}同时,请更新 BookRepository 的主键类型以匹配 isbn 字段(当前为 String,但 CrudRepository<Book, Integer> 声明主键类型为 Integer,会造成类型不匹配):
// BookRepository.java
package com.example.demo.dao;
import org.springframework.data.repository.CrudRepository;
import com.example.demo.model.Book;
// ✅ 主键类型改为 String,与 @Id 字段类型一致
public interface BookRepository extends CrudRepository<Book, String> {
}此外,建议优化控制器写法,避免重复查询:
@GetMapping("/allbook")
public List<Book> getAll() {
List<Book> books = bookrepository.findAll();
System.out.println("data size: " + books.size()); // 日志确认数量
return books; // 直接返回,无需强转
}⚠️ 注意事项:
- @Data 已包含 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor,无需额外添加;
- 若数据库 isbn 列实际为数字类型(如 BIGINT),则 Java 字段应为 Long 或 Integer,并调整 @GeneratedValue 策略(如 GenerationType.AUTO);
- 如需保留大写字段名(如 ISBN),可配合 @JsonProperty("isbn") 强制指定序列化名称,但违背 Java 命名规范,不推荐;
- 确保 spring-boot-starter-web 和 spring-boot-starter-data-jpa 依赖已正确引入,且 MySQL 驱动版本与 Spring Boot 兼容(推荐 mysql:mysql-connector-java:8.0.33+)。
修复后重启应用,访问 http://localhost:8181/allbook 即可获得正确 JSON 响应,例如:
[
{"isbn":"978-1-2345-6789-0","name":"Spring Boot in Action","author":"Craig Walls","introduction":"A guide to building production-ready Spring applications..."},
...
]


















