Vaadin+Spring Boot集成JDBC Session引发持续重启循环求助
解决Vaadin + Spring Session JDBC 应用持续重启循环问题
问题根源分析
- Spring Session JDBC的自动配置会覆盖Vaadin默认会话管理机制,导致会话状态频繁变更触发Spring Boot DevTools重启(若启用)
- H2数据库文件模式配置不当,数据库文件频繁修改触发DevTools文件监控重启
- Spring Session JDBC表初始化逻辑与Vaadin会话存储逻辑存在冲突
分步解决方案
1. 调整DevTools重启策略
若使用了Spring Boot DevTools,可直接禁用自动重启:
# application.properties spring.devtools.restart.enabled=false
如需保留DevTools功能,可排除数据库相关文件的监控:
spring.devtools.restart.exclude=h2/**,*.db
2. 明确配置Spring Session与H2参数
在application.properties中指定会话存储类型、数据库连接方式,避免自动配置冲突:
# 配置Spring Session使用JDBC存储 spring.session.store-type=jdbc # 确保表初始化完成后再启动应用 spring.session.jdbc.initialize-schema=always # H2使用内存模式,避免文件变更触发重启 spring.datasource.url=jdbc:h2:mem:sessiondb;DB_CLOSE_DELAY=-1 spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
3. 排除冲突的自动配置类
创建配置类,排除Vaadin与Spring Session冲突的自动配置项:
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration(exclude = SessionAutoConfiguration.class) public class CustomSessionConfig { // 自定义会话管理逻辑 }
4. 手动初始化Spring Session数据库表(可选)
若禁用自动表初始化,可执行以下SQL创建所需表结构:
CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) ); CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BYTEA NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE );
5. 验证Vaadin与Spring Session集成
在Vaadin视图中通过HTTP Session存储用户活动数据:
@Route public class ActivityView extends VerticalLayout { public ActivityView() { Button saveActivity = new Button("记录活动", event -> { HttpSession httpSession = VaadinSession.getCurrent().getSession(); httpSession.setAttribute("lastActivity", LocalDateTime.now().toString()); }); add(saveActivity); } }
额外排查要点
- 查看应用日志,定位
Restarting due to change in...类日志,明确重启触发源 - 确认版本兼容性:Vaadin 23对应Spring Boot 2.7.x,Vaadin 24对应Spring Boot 3.x
- 简化依赖:若无需JPA完整功能,将
spring-boot-starter-data-jpa替换为spring-boot-starter-jdbc,减少自动配置冲突
内容的提问来源于stack exchange,提问作者Shubham
相关产品推荐
相关产品推荐

