当前位置: 首页 > 知识库问答 >
问题:

意外NoSuchmetodError RowMetadata.get列元数据()-尽管有正确的依赖关系

罗奇文
2023-03-14

当运行我的应用程序(Spring Boot 2.5.7)-更新到spring-data-r2dbc 1.3.7后,我得到了NoSuchmetodError RowMetadata.getClonMetadatas()

(我也在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。释放
  • 组织。postgresql:r2dbc postgresql-0.9.0。RC1

r2dbc postgresql的0.9.0 RC1实现了spi合同。看来一切都应该准备好了-

spring-data-r2dbc(1.3.7)的正确版本调用了

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的方法。发布r2dbc spi接口,该接口由0.9.0实现。r2dbc postgresql的RC1版本。

我查看了我的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(...

我还

  1. 将my JDK更新为Corretto 1.8的最新版本

我将尝试获得一个复制此内容的测试,但希望有人有想法让我尝试修复或调试。

共有1个答案

东方俊杰
2023-03-14

我终于有时间回到这个话题上来了。查看RowMetadataUtils的字节码,我们可以看到

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。返回迭代器的GetColumnMetadata<这是r2dbc spi 0.8.5版本的签名。在以后的版本中,这已被更改为返回一个列表,该列表将被解析为r2dbc postgresql中的相应方法。因此,spring-data-r2dbc的1.4.0版本应该针对0.0.9进行编译。r2dbc spi的发布版本。

 类似资料:
  • 我是IntelliJ/静态编程语言的新手;在我的. kts文件中: 但是在我的Main.java, 它不识别导入的“redis”部分(“redis”是红色的,未解析的对 redis 的引用) 我做错了什么?

  • JUnit Platform Group ID: org.junit.platform Version: `` Artifact IDs: Artifact 说明 junit-platform-commons JUnit的内部公共库/工具。 这些工具预期仅用于在JUnit框架本身内部使用。 不支持任何外部使用。使用它需要自己承担风险! junit-platform-console 支持从控制台发现

  • 自从在JDK1.0中引入Object#Finalize()之后,Java又推出了9个版本。 然而,尽管它有明显的缺点,但它仍然可用,即使在JDK10中也是如此。 这就引出了一个问题:这种方法是否有任何已知的正确用法?

  • 在上面的MIPS代码中,在解决方案表中,真正的依赖项标记为I3-

  • 我正在尝试构建一个(继承的)Android项目。我正在使用Ant 在样式.xml中,存在无法解析的引用,例如: 这是我遇到的最初错误: 然后我注意到有这个appcompat引用,它在我的(OS X)机器上被破坏了: 我试图通过相对于的引用来解决这个问题: 所以现在这条路应该是正确的。但是现在当我运行: 有什么想法吗?构建这个项目最简单的方法是什么? (请注意,针对ecplise的建议对我没用。)

  • 我有一个python中的ApacheBeam管道,不管出于什么原因,它都有下面这样的流。 SQL作业-- 当我在本地运行此程序时,此序列工作正常。然而,当我试图将其作为数据流管道运行时,它实际上并没有按此顺序运行。 在数据流上运行时是否有强制依赖关系的方法?