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

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>

验证步骤

  1. 优先添加H2兼容配置,重新运行测试
  2. 若仍报错,补充主键生成策略注解
  3. 最后替换初始化方式并升级H2版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:55:17