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

Spring Boot Rest API返回空数据求助(H2数据库)

问题排查与解决方案

核心问题:无效日期值导致初始化脚本执行失败

你的data.sql里第一条插入语句的日期'200-12-05'是无效的——年份仅三位,H2数据库的DATE类型无法识别该格式,会导致整个初始化脚本执行中断,因此数据未插入到表中。

具体修复步骤

  1. 修正data.sql中的日期值
    将无效日期改为合法格式,比如把'200-12-05'调整为'2020-12-05':

    INSERT INTO todo (task,date,is_done) VALUES ('sleep','2020-12-05',false);
    INSERT INTO todo (task,date,is_done) VALUES ('down','2001-12-05',true);
    
  2. 验证脚本执行日志
    你的配置已开启JdbcTemplate的DEBUG日志,启动项目后查看控制台日志,可确认data.sql是否执行,以及是否存在SQL错误提示——之前的无效日期会触发类似Invalid value for date的异常日志。

  3. 补充实体类必要方法(可选但推荐)
    你的Todo实体类缺少显式无参构造、getter/setter方法,虽然JPA会默认生成无参构造,但缺少getter会导致接口返回的JSON为空(即使数据库有数据)。建议补充这些方法:

    package todo.model;
    
    import java.time.LocalDate;
    
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.Table;
    
    @Entity
    @Table(name = "todo")
    public class Todo {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String task;
        private LocalDate date;
        private boolean isDone;
    
        // 无参构造
        public Todo() {}
    
        // 全参构造(可选)
        public Todo(String task, LocalDate date, boolean isDone) {
            this.task = task;
            this.date = date;
            this.isDone = isDone;
        }
    
        // getter和setter方法
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getTask() {
            return task;
        }
    
        public void setTask(String task) {
            this.task = task;
        }
    
        public LocalDate getDate() {
            return date;
        }
    
        public void setDate(LocalDate date) {
            this.date = date;
        }
    
        public boolean isDone() {
            return isDone;
        }
    
        public void setDone(boolean done) {
            isDone = done;
        }
    }
    

其他配置确认

你的application.properties中spring.jpa.defer-datasource-initialization=true的配置正确,该设置确保Hibernate创建完数据表后再执行data.sql,无需修改。

完成以上修改后重启项目,访问/todo/findall接口即可看到初始化数据。

内容的提问来源于stack exchange,提问作者Othmane Boudali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:31