Spring Boot应用正常运行但/api/products端点无数据返回排查
排查H2数据库有数据但/api/products端点返回空的问题
针对你遇到的问题,结合提供的代码、配置和日志,可按以下步骤逐一排查:
1. 确认H2控制台连接的是应用使用的同一个内存数据库实例
H2内存数据库(mem:模式)是JVM进程内的实例,只有使用完全相同的JDBC URL才能访问同一个库:
- 打开H2控制台时,确保JDBC URL与
application.properties中的spring.datasource.url完全一致:jdbc:h2:mem:telusko - 如果控制台使用默认的
jdbc:h2:mem:testdb,你看到的数据属于另一个独立的内存库实例,而应用实际使用的telusko库可能为空。
2. 检查数据初始化脚本的执行情况
从日志中仅看到Hibernate创建product表的SQL,未发现数据插入的日志,需确认初始化脚本是否正确执行:
- 确保
src/main/resources目录下存在data.sql(或import.sql),且文件中包含插入product表的SQL语句,例如:INSERT INTO product (available, brand, category, description, name, price, quantity, release_date) VALUES (true, 'Apple', 'Electronics', 'iPhone 15', 'iPhone 15 Pro', 999.99, 50, '2024-09-20 00:00:00'); - 检查
application.properties中的配置:spring.sql.init.mode=always已开启,确保脚本会执行- 若脚本文件名不是
data.sql/import.sql,需指定spring.sql.init.data-location=classpath:你的脚本名.sql - 可添加
spring.sql.init.encoding=UTF-8避免编码问题
3. 验证Service与Repository层的查询逻辑
你的Controller调用service.getAllProducts(),但Service和Repository代码未提供,需确认:
- ProductRepository需正确继承
JpaRepository<Product, Integer>,例如:@Repository public interface ProductRepository extends JpaRepository<Product, Integer> { } - Service层的
getAllProducts()需正确调用Repository的findAll()方法:@Service public class ProductService { private final ProductRepository repository; // 推荐构造注入而非@Autowired public ProductService(ProductRepository repository) { this.repository = repository; } public List<Product> getAllProducts() { return repository.findAll(); } } - 若使用自定义JPQL查询,需确认语句正确(如
@Query("SELECT p FROM Product p"))
4. 检查Product实体类的映射正确性
实体类与数据库表的映射错误可能导致查询无结果:
- 确保类上添加
@Entity注解,主键字段添加@Id和@GeneratedValue注解:@Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private String brand; // 注意字段名与表列名的映射,如数据库列是release_date,实体字段需对应: @Column(name = "release_date") private LocalDateTime releaseDate; // 其他字段及getter/setter // 必须包含无参构造函数(Spring Data JPA需要) public Product() {} } - 确认实体类字段类型与数据库列类型匹配(如
price对应numeric(38,2),实体用BigDecimal)
5. 添加调试日志确认数据流向
在Controller和Service层添加日志,明确数据是否从数据库查询到:
@GetMapping("/products") public List<Product> getAllProducts(){ List<Product> products = service.getAllProducts(); System.out.println("查询到的产品数量:" + products.size()); return products; }
若日志显示数量为0,说明Repository未查询到数据;若数量大于0但浏览器显示空,需检查实体类的序列化(Spring MVC默认用Jackson序列化,确保字段有getter方法)
补充:关于Hibernate缓存的问题
你提到启用缓存时应用无法启动,禁用后正常,但缓存并非导致空数据的原因。若后续需要启用缓存,需确保引入了对应的缓存依赖(如spring-boot-starter-cache)并配置正确的缓存实现(如Ehcache)。
内容的提问来源于stack exchange,提问作者Nagarjuna
相关产品推荐
相关产品推荐

