Vertx JDBC NoSuchMethodError 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.g

Posted

技术标签:

【中文标题】Vertx JDBC NoSuchMethodError \'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.getConnection()\'【英文标题】:Vertx JDBC NoSuchMethodError 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.getConnection()'Vertx JDBC NoSuchMethodError 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.getConnection()' 【发布时间】:2021-12-27 19:26:26 【问题描述】:

我正在尝试将 vertx JDBC 与 MS SQL Server 一起使用。

我得到以下堆栈跟踪:

Exception in thread "vertx-jdbc-service-get-connection-thread" Exception in thread "vertx-jdbc-service-get-connection-thread" java.lang.NoSuchMethodError: 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.getConnection()'
    at io.agroal.pool.ConnectionPool.wrapperFromTransaction(ConnectionPool.java:162)
    at io.agroal.pool.ConnectionPool.getConnection(ConnectionPool.java:129)
    at io.agroal.pool.DataSource.getConnection(DataSource.java:61)
    at io.vertx.ext.jdbc.impl.JDBCClientImpl.lambda$null$4(JDBCClientImpl.java:232)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:831)
java.lang.NoSuchMethodError: 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.getConnection()'
    at io.agroal.pool.ConnectionPool.wrapperFromTransaction(ConnectionPool.java:162)
    at io.agroal.pool.ConnectionPool.getConnection(ConnectionPool.java:129)
    at io.agroal.pool.DataSource.getConnection(DataSource.java:61)
    at io.vertx.ext.jdbc.impl.JDBCClientImpl.lambda$null$4(JDBCClientImpl.java:232)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:831)

我的build.gradle的一部分:

  implementation platform("io.vertx:vertx-stack-depchain:4.2.1")
  implementation "io.vertx:vertx-core"
  implementation 'io.vertx:vertx-jdbc-client:4.2.1'
  implementation "io.vertx:vertx-lang-groovy"
  implementation 'io.agroal:agroal-api:1.13'
  implementation 'io.agroal:agroal-pool:1.13'
  implementation "com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre16"

我尝试选择其他版本,但总是遇到同样的错误。我尝试寻找库函数,但使用getConnection() 方法找不到TransactionIntegration 的any version。

我的代码:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.*;
import io.vertx.jdbcclient.JDBCConnectOptions;
import io.vertx.jdbcclient.JDBCPool;
import io.vertx.sqlclient.*;

public class MainVerticle extends AbstractVerticle 

     @Override
     public void start(Promise<Void> startPromise) throws Exception 

        JDBCPool pool = JDBCPool.pool(
                vertx,
                new JDBCConnectOptions()
                .setJdbcUrl("jdbc:sqlserver://some_ip;databaseName=mydatabase")
                .setUser("user")
                .setPassword("password"),
                new PoolOptions().setMaxSize(16)
                );
        pool
          .query("SELECT * FROM test")
          .execute()
          .onFailure(e -> 
              e.printStackTrace();
          )
    

【问题讨论】:

【参考方案1】:

当前的 4.2.1 版本似乎依赖于 agroal 1.12。

鉴于您收到了NoSuchMethodError,我认为这可能与编译后的 jar 是针对 1.12 的事实有关,但您正在针对旧版本运行,可能是 1.0 或 1.1。查看 github,您可以找到与这些版本匹配的跟踪。

尝试升级到 1.12,它应该可以解决您的错误。

【讨论】:

不幸的是,没有。错误不会改变。而且我找不到任何具有这种方法的版本:github.com/agroal/agroal/commits/master/agroal-api/src/main/… 问题是在您的项目中的某个地方,一个依赖项正在拉动 agroal 1.1 或 1.0,因为这与您列出的堆栈跟踪完全匹配:github.com/agroal/agroal/blob/1.0/agroal-pool/src/main/java/io/… 看第 162 行。鉴于 vertx jdbc 是针对 1.12 构建的导致问题。 嗯。知道如何检测到发生这种情况的位置吗? 这个问题显然可以通过移除 agroal 依赖,刷新 gradle,插入完全相同的 agroal 依赖,然后再次刷新来解决。【参考方案2】:

显然,gradle 只是被窃听了。

按照 Paulo Lopes 的建议,我将 agroal 版本更改为 1.12。但是,这并没有解决问题。

我不知道,究竟是什么解决了它,但我只会列出我做了什么:

删除两个农业依赖项 插入 agroal-api 删除 agroal-api 插入 agroal-api 插入农业池

我没有检查是否有必要使用 agroal 1.12,或者究竟是什么步骤解决了它。而且我不打算尝试它,我只是很高兴,它终于奏效了。

【讨论】:

以上是关于Vertx JDBC NoSuchMethodError 'java.sql.Connection io.agroal.api.transaction.TransactionIntegration.g的主要内容,如果未能解决你的问题,请参考以下文章

Vert.x JDBC 客户端:无法加载所需的实现

如何从vert.x scala jdbc客户端检索数据库元数据?

结合vert.x和mongo构建应用

我应该为 Vertx 应用程序中的对象创建静态 Vertx 实例吗?

Vertx 路由初体验

Vertx 路由初体验