Spring Boot + MySQL 返回空对象问题的完整解决方案

星宇同学_6691

星宇同学_6691

2026-07-25

287人浏览

原创

Spring Boot + MySQL 返回空对象问题的完整解决方案

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 = "...") 显式映射数据库列名:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
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 声明主键类型为 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> {
}</book>

此外,建议优化控制器写法,避免重复查询:

@GetMapping("/allbook")
public List<book> getAll() {
    List<book> books = bookrepository.findAll();
    System.out.println("data size: " + books.size()); // 日志确认数量
    return books; // 直接返回,无需强转
}</book></book>

⚠️ 注意事项:

  • @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..."},
  ...
]

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2073

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2792

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4648

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4911

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4382

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5714

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring Boot 官方快速入门指南
Spring Boot 官方快速入门指南

共0课时 | 0人学习

Spring Boot 官方参考文档
Spring Boot 官方参考文档

共0课时 | 0人学习

尚硅谷新版SpringBoot3教程
尚硅谷新版SpringBoot3教程

共0课时 | 0人学习