Reactive Spring Boot测试H2数据库时遇Long转Integer类型转换异常
Reactive Spring Boot单元测试用H2执行data.sql时出现Long转Integer类型转换异常
问题定位
你遇到的类型转换异常,核心原因是H2默认模式下的类型映射和PostgreSQL不一致,导致BIGINT字段被错误解析为Integer类型,和实体类的Long类型冲突。
解决方案
1. 开启H2的PostgreSQL兼容模式
在测试环境配置文件(application-test.properties/application-test.yml)中添加H2兼容配置,让H2的类型规则和PostgreSQL对齐:
# application-test.properties spring.datasource.url=jdbc:h2:mem:testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH spring.datasource.driver-class-name=org.h2.Driver
MODE=PostgreSQL:强制H2使用PostgreSQL的语法和类型映射规则DATABASE_TO_LOWER=TRUE:匹配PostgreSQL表名小写的特性,和你的实体类、SQL脚本规则保持一致
2. 规范主键注解(若涉及自增)
如果生产环境PostgreSQL的id字段是自增序列/标识列,实体类需补充主键生成策略注解,避免H2自动推断类型错误:
@Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) // 对应PostgreSQL的SERIAL/BIGSERIAL类型 private Long id;
3. 替换手动初始化Bean为Spring测试原生注解
你手动配置的ConnectionFactoryInitializer可能存在脚本执行顺序和实体类映射冲突的问题,改用Spring测试的@Sql注解更可靠:
@SpringBootTest @Sql(scripts = "classpath:data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) class FullConnectionTest { // 测试代码逻辑 }
这个注解会自动在测试方法执行前加载并执行SQL脚本,避免手动初始化带来的时序问题。
4. 升级H2版本至最新稳定版
旧版本H2存在类型映射的bug,确保依赖的H2版本是2.x系列:
<!-- pom.xml --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> <version>2.2.224</version> </dependency>
验证步骤
- 优先添加H2兼容配置,重新运行测试
- 若仍报错,补充主键生成策略注解
- 最后替换初始化方式并升级H2版本
内容的提问来源于stack exchange,提问作者thecoderenroute
相关产品推荐
相关产品推荐

