
Spring Boot 项目中 MySQL 查询返回空 JSON 对象(如 [{}, {}, {}]),通常并非数据库连接或 SQL 执行失败,而是实体类字段命名与 Lombok 生成的 getter/setter 不匹配导致序列化失败。
spring boot 项目中 mysql 查询返回空 json 对象(如 `[{}, {}, {}]`),通常并非数据库连接或 sql 执行失败,而是实体类字段命名与 lombok 生成的 getter/setter 不匹配导致序列化失败。
在你提供的代码中,Book 实体类字段使用了大驼峰命名(如 ISBN、Name、Author、Introduction),而 JPA/Hibernate 与 Jackson(Spring 默认 JSON 序列化器)均依赖 JavaBean 规范:getter/setter 方法名需严格基于小驼峰(camelCase)字段名生成。Lombok 的 @Getter 和 @Setter 注解正是依据字段名自动生成对应方法——例如字段 private String ISBN; 会生成 getISBN() 和 setISBN(),但 Jackson 在序列化时默认查找的是 getIsbn()(即 isbn 字段对应的 getter),而非 getISBN()。由于找不到符合规范的 getter,Jackson 将该字段视为不可访问,最终输出空对象 {}。
此外,JPA 映射也存在隐性冲突:虽然 @Column(name = "isbn") 指定了数据库列名,但 Hibernate 仍需通过标准 getter 访问字段值。若 getter 签名不规范(如 getISBN() 不符合 JavaBean 推导规则),可能导致属性读取失败或回退为默认行为,进一步加剧数据不可见问题。
✅ 正确做法是:将所有字段改为标准小驼峰命名,并移除冗余的 @Column 显式声明(除非列名与字段名不一致)。修改后的 Book.java 如下:
package com.example.demo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "book")
@Data // @Data 已包含 @Getter @Setter @ToString @EqualsAndHashCode,更简洁
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String isbn; // ✅ 小驼峰:对应数据库列 `isbn`
private String name; // ✅ 对应 `name`
private String author; // ✅ 对应 `author`
private String introduction;// ✅ 对应 `introduction`
}
⚠️ 注意事项:
- @Data 可替代分散的 @Getter/@Setter,更简洁且避免遗漏;
- @GeneratedValue(strategy = GenerationType.IDENTITY) 表示主键由 MySQL 自增生成,但你的 isbn 字段在数据库中若为字符串类型(如 VARCHAR),不应使用 IDENTITY 策略(它仅适用于整数型自增主键)。请确认 isbn 是否为真正主键且类型匹配;若 isbn 是业务主键(非自增),应去掉 @GeneratedValue,并确保数据库中该字段有值;
- BookRepository 的泛型参数应与主键类型一致:当前 CrudRepository
声明主键为 Integer,但 isbn 是 String 类型 → 必须修正为 CrudRepository ,否则运行时可能抛出 ClassCastException 或查询失效; - 控制器中两次调用 bookrepository.findAll() 属于冗余操作,建议只查一次并复用结果。
修正后重启应用,访问 http://localhost:8181/allbook 即可正确返回带字段值的 JSON 数组,例如:
[
{"isbn":"978-1-2345-6789-0","name":"Spring Boot Guide","author":"John Doe","introduction":"A practical tutorial..."},
...
]
总结:Spring Boot 数据显示为空,90% 源于实体字段命名违反 JavaBean 规范。坚持小驼峰命名、校验主键类型一致性、善用 Lombok 合理注解,是快速定位与解决此类问题的核心实践。











