H2 Database无法从schema.sql创建表的问题排查
问题排查与解决方案
一、H2控制台看不到contact_msg表的原因及解决
1. 确认数据库连接参数一致性
检查application.properties中的JDBC URL是否与H2控制台连接时使用的URL完全一致:
- 比如配置文件中是
spring.datasource.url=jdbc:h2:mem:eazybitesdb,那控制台连接时必须填相同的URL,否则会连接到另一个内存数据库,自然看不到表。 - 同时确认用户名(
spring.datasource.username)、密码(spring.datasource.password)与控制台输入的一致。
2. 确保schema.sql被Spring Boot执行
- 确认
schema.sql放在src/main/resources目录下(这是Spring Boot默认加载初始化脚本的位置)。 - 检查脚本语法:比如
CREATE TABLE contact_msg语句是否有语法错误,比如字段类型、括号是否匹配,没有拼写错误。 - 若使用Spring Boot 2.5+版本,需添加配置:
spring.sql.init.mode=always,强制执行初始化脚本(默认仅在嵌入式数据库无预初始化数据时才执行)。
3. 切换到正确的Schema
连接H2控制台后,左侧导航栏选择对应的Schema(比如默认的PUBLIC,如果脚本中指定了自定义Schema则选对应名称),才能看到该Schema下创建的表。
二、Spring Security配置无效的原因及解决
1. 确认依赖正确引入
检查pom.xml中是否包含Spring Security依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
确保依赖版本与Spring Boot版本匹配。
2. 修正Security配置类
H2控制台依赖Frame和特定路径访问,需在配置中放行并关闭对应限制:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 放行H2控制台所有路径 .authorizeHttpRequests(auth -> auth .requestMatchers("/h2-console/**").permitAll() .anyRequest().authenticated() ) // 忽略H2控制台的CSRF校验 .csrf(csrf -> csrf.ignoringRequestMatchers("/h2-console/**")) // 允许H2控制台的Frame嵌套 .headers(headers -> headers.frameOptions(frame -> frame.sameOrigin())); return http.build(); } }
- 注意:如果是Spring Boot 2.7以前版本,配置方式略有不同,需使用
http.csrf().ignoringAntMatchers("/h2-console/**")和http.headers().frameOptions().sameOrigin()。
3. 排查配置冲突
- 检查是否存在多个
@Configuration标注的Security配置类,导致配置被覆盖。 - 检查
application.properties中是否有Security相关属性(比如spring.security.user.name等)与配置类逻辑冲突。
内容的提问来源于stack exchange,提问作者Mario Mateaș
相关产品推荐
相关产品推荐

