Java 21泛型兼容性异常排查及官方Bug反馈
Java 21泛型兼容性问题导致Jdbi无法识别泛型类型的解决方法
问题现象
- 升级至Java 21后,使用Jdbi进行数据库访问时出现泛型类型无法识别的异常
- 调试对比Java 17与Java 21的差异:当type为接口时,
type instanceof Class判断在Java 17中返回false,Java 21中返回true - Jdbi依赖的Geantyref库中,
GenericTypeReflector.getTypeParameter(..)方法在Java 17中能正常返回泛型类型,Java 21中返回null
根源分析
问题核心在于Java 21中record类的默认构造函数会丢失泛型参数信息。例如定义如下record:
record Person(Optional<String> name, Optional<Integer> age) {}
其默认构造函数的泛型<String>和<Integer>元数据丢失,导致Jdbi无法正确解析泛型类型,进而引发依赖库的方法返回异常。
解决方案
为record类添加带@JdbiConstructor注解的显式规范构造函数,手动保留泛型信息,示例代码如下:
record Person(Optional<String> name, Optional<Integer> age) { @JdbiConstructor Person { // 构造函数体可留空,仅用于保留泛型元数据 } }
Bug追踪
该兼容性问题已提交至OpenJDK官方Bug报告,分配编号为JDK-8320575
内容的提问来源于stack exchange,提问作者Joost den Boer
相关产品推荐
相关产品推荐

