运行我的应用程序(Spring Boot 2.5.7)时 - 更新到 spring-data-r2dbc 1.3.7 后,我得到了NoSuchMethodError RowMetadata.getColumnMetadatas()
.
(我也尝试过 1.4.0 - 1.3.7 是问题首先出现的地方。)
在此 spring-data-r2dbc 版本中,已进行更改以从getColumnNames
(请参阅https://github.com/spring-projects/spring-data-r2dbc/issues/683)移至getColumnMetaDatas()
.
奇怪的是我也有依赖
- r2dbc-spi-0.9.0.RELEASE
- org.postgresql:r2dbc-postgresql - 0.9.0.RC1
r2dbc-postgresql 的 0.9.0 RC1 履行了 spi 合约。所以,似乎一切都应该到位——
spring-data-r2dbc (1.3.7) 的正确版本调用getColumnMetaDatas()
:
public static boolean containsColumn(RowMetadata metadata, String name) {
for (ColumnMetadata columnMetadata : metadata.getColumnMetadatas()) {
if (name.equalsIgnoreCase(columnMetadata.getName())) {
return true;
}
}
return false;
}
这是 0.0.9.RELEASE r2dbc-spi interface 的一个方法,RowMetaData
由 r2dbc-postgresql 的 0.9.0.RC1 版本实现PostgresqlRowMetadata
。
我查看了我的 maven 依赖树,并没有看到其中任何一个的竞争版本。
我可以假设实现与 spi 的绑定很糟糕,但我已经足够远了,可以调用数据库然后尝试提取数据,所以这似乎不对。因此,似乎还有其他事情发生了。
我添加了命令行选项-verbose:class
以查看正在加载哪些类/jar,并且从那里看起来也正确:
[30.756s][info][class,load] io.r2dbc.postgresql.message.frontend.CompositeFrontendMessage$$Lambda$2382/0x0000000800ee3840 source: io.r2dbc.postgresql.message.frontend.CompositeFrontendMessage
[30.756s][info][class,load] io.r2dbc.postgresql.message.frontend.Bind$$Lambda$2383/0x0000000800ee3c40 source: io.r2dbc.postgresql.message.frontend.Bind
[30.757s][info][class,load] io.r2dbc.postgresql.message.frontend.Bind$$Lambda$2384/0x0000000800ee4040 source: io.r2dbc.postgresql.message.frontend.Bind
[30.757s][info][class,load] io.r2dbc.postgresql.message.frontend.Bind$$Lambda$2385/0x0000000800ee4440 source: io.r2dbc.postgresql.message.frontend.Bind
[30.761s][info][class,load] io.r2dbc.postgresql.message.backend.ParseComplete source: file:/<removed>/.m2/repository/org/postgresql/r2dbc-postgresql/0.9.0.RC1/r2dbc-postgresql-0.9.0.RC1.jar
[30.762s][info][class,load] org.springframework.data.r2dbc.convert.RowMetadataUtils source: file:/<removed>/.m2/repository/org/springframework/data/spring-data-r2dbc/1.3.7/spring-data-r2dbc-1.3.7.jar
堆栈跟踪:
java.lang.NoSuchMethodError:
io.r2dbc.spi.RowMetadata.getColumnMetadatas()Ljava/lang/Iterable;
at org.springframework.data.r2dbc.convert.RowMetadataUtils.containsColumn(RowMetadataUtils.java:38)
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.extractGeneratedIdentifier(MappingR2dbcConverter.java:646)
... 2 frames excluded
at io.r2dbc.postgresql.PostgresqlResult.lambda$map$2(PostgresqlResult.java:123)
at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(...
我也有
- 将我的 JDK 更新到最新版本的 Corretto 1.8
- 使用该版本编译 spring-data-r2dbc 1.4.0 并使用它
- 在 RowMetaDataUtils 中插入代码以反映和记录
metadata
在containsColumn(...)
. 结果包括public java.util.List<io.r2dbc.postgresql.PostgresqlColumnMetadata> io.r2dbc.postgresql.PostgresqlRowMetadata.getColumnMetadatas()
,这使得这更加令人困惑。
我会尝试做一个重复这个的测试 - 但希望有人有一个想法让我尝试修复或调试。