Spring Boot Rest API返回空数据求助(H2数据库)
问题排查与解决方案
核心问题:无效日期值导致初始化脚本执行失败
你的data.sql里第一条插入语句的日期'200-12-05'是无效的——年份仅三位,H2数据库的DATE类型无法识别该格式,会导致整个初始化脚本执行中断,因此数据未插入到表中。
具体修复步骤
修正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);验证脚本执行日志
你的配置已开启JdbcTemplate的DEBUG日志,启动项目后查看控制台日志,可确认data.sql是否执行,以及是否存在SQL错误提示——之前的无效日期会触发类似Invalid value for date的异常日志。补充实体类必要方法(可选但推荐)
你的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
相关产品推荐
相关产品推荐

