You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:15:06