首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外的NoSuchMethodError RowMetadata.getColumnMetadatas() -尽管存在正确的依赖关系

意外的NoSuchMethodError RowMetadata.getColumnMetadatas() -尽管存在正确的依赖关系
EN

Stack Overflow用户
提问于 2021-12-22 20:42:08
回答 1查看 454关注 0票数 0

当运行我的应用程序(SpringBoot2.5.7)-在更新到spring r2dbc 1.3.7之后,我得到了NoSuchMethodError RowMetadata.getColumnMetadatas()

(我也尝试过1.4.0-1.3.7是问题首先出现的地方。)

在这个春季的数据-r2dbc发行版中,已经做了一个更改,将getColumnNames (参见https://github.com/spring-projects/spring-data-r2dbc/issues/683)转移到getColumnMetaDatas()

奇怪的是,我也有依赖项。

0.9.0.RELEASE

  • org.postgresql:r2dbc-postgresql -
  • r2dbc-spi - 0.9.0.RC1

r2dbc-postgresql的0.9.0 RC1实现了spi契约。所以,似乎一切都应该就位-

spring r2dbc (1.3.7)的正确版本调用getColumnMetaDatas()

代码语言:javascript
复制
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 RELEASEr2dbc-spi接口RowMetaData的一种方法,由r2dbc-postgresql PostgresqlRowMetadata的0.9.0.RC1版本实现。

我查看了我的maven依赖树,没有看到其中任何一个相互竞争的版本。

我可以假设,将实现绑定到spi是错误的,但我已经做了足够多的工作,可以调用数据库,然后尝试提取数据,因此这似乎不正确。所以,似乎还有别的事情发生了。

我添加了命令行选项-verbose:class,以查看加载了哪些类/jars,从那里看上去也是正确的:

代码语言:javascript
复制
[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

堆栈跟踪:

代码语言:javascript
复制
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(...

我也

  1. 更新了我的JDK到Corretto 1.8
  2. 的最新版本,用该版本编译了spring r2dbc 1.4.0,并使用它在RowMetaDataUtils中插入了
  3. 代码,以反映和记录在containsColumn(...)metadata参数中找到的方法。结果包括public java.util.List<io.r2dbc.postgresql.PostgresqlColumnMetadata> io.r2dbc.postgresql.PostgresqlRowMetadata.getColumnMetadatas(),这使得这更加令人困惑。

我将尝试获得一个与此重复的测试--但希望有人有一个想法让我尝试修复或调试。

EN

回答 1

Stack Overflow用户

发布于 2021-12-28 17:48:40

我终于有时间回到这里来了。看看RowMetadataUtils的字节码,我们看到

代码语言:javascript
复制
public static boolean containsColumn(io.r2dbc.spi.RowMetadata, java.lang.String);
    descriptor: (Lio/r2dbc/spi/RowMetadata;Ljava/lang/String;)Z
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=2
         0: aload_0
         1: invokeinterface #2,  1            // InterfaceMethod io/r2dbc/spi/RowMetadata.getColumnMetadatas:()Ljava/lang/Iterable;
         6: invokeinterface #3,  1            // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
        11: astore_2

在这里,我们看到我们正在寻找一个返回迭代器的接口方法RowMetadata.getColumnMetadatas

这是r2dbc-spi的0.8.5版本的签名。在以后的版本中,这已经更改为返回一个列表,该列表将被解析为r2dbc-postgresql中的适当方法。因此,spring r2dbc的1.4.0发行版应该针对0.0.9.RELEASE版本的r2dbc-spi进行编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70454873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档