简体   繁体   English

JDBi 声明式样式 - class 未找到

[英]JDBi Declarative style - class not found

I am trying to use the declarative style of JDBI to get data from the table.我正在尝试使用 JDBI 的声明式样式从表中获取数据。 It is failing with the NoClassDefFoundError.它因 NoClassDefFoundError 而失败。

When i tried with Fluet style in JDBI, it works fine.当我尝试在 JDBI 中使用 Fluet 风格时,它工作正常。

POM.xml POM.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.jdbi</groupId>
            <artifactId>jdbi3-core</artifactId>
            <version>3.19.0</version>
        </dependency>
        <dependency>
            <groupId>org.jdbi</groupId>
            <artifactId>jdbi3-sqlobject</artifactId>
            <version>3.35.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.13.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.13.1.1</version>
        </dependency>

Registerd the SqlObject plugin注册了 SqlObject 插件

    @Bean
    public Jdbi jdbi(DataSource ds, List<JdbiPlugin> jdbiPlugins, List<RowMapper<?>> rowMappers) {
        TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(ds);
//        Jdbi jdbi = Jdbi.create("jdbc:derby:memory:local");
        Jdbi jdbi = Jdbi.create(ds);
        jdbi.installPlugin(new SqlObjectPlugin());

        return jdbi;
    }

DOA DOA

public interface FolioDao {

    @SqlQuery("select * from FOLIO")
    @UseRowMapper(FolioMapper.class)
    List<Folio> findAll();

}

Service服务

public Iterable<Folio> getAllFolio(Jdbi jdbi) {

        return jdbi.withExtension(FolioDao.class, dao -> dao.findAll());

    }

error错误

java.lang.ClassNotFoundException: org.jdbi.v3.core.extension.ExtensionContext
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    at org.jdbi.v3.sqlobject.internal.SqlObjectInitData.lambda$lazyInvoker$0(SqlObjectInitData.java:129) ~[jdbi3-sqlobject-3.35.0.jar:3.35.0]
    at org.jdbi.v3.core.internal.MemoizingSupplier.init(MemoizingSupplier.java:42) ~[jdbi3-core-3.19.0.jar:3.19.0]
    at org.jdbi.v3.core.internal.MemoizingSupplier.get(MemoizingSupplier.java:36) ~[jdbi3-core-3.19.0.jar:3.19.0]
    at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$attach$2(SqlObjectFactory.java:107) ~[jdbi3-sqlobject-3.35.0.jar:3.35.0]
    at jdk.proxy2/jdk.proxy2.$Proxy67.findAll(Unknown Source) ~[na:na]
    at com.chakra.projects.investment.service.funds.FundManagerSvc.lambda$getAllFolio$0(FundManagerSvc.java:28) ~[classes/:na]
    at org.jdbi.v3.core.Jdbi.callWithExtension(Jdbi.java:476) ~[jdbi3-core-3.19.0.jar:3.19.0]
    at org.jdbi.v3.core.Jdbi.withExtension(Jdbi.java:463) ~[jdbi3-core-3.19.0.jar:3.19.0]
    at com.chakra.projects.investment.service.funds.FundManagerSvc.getAllFolio(FundManagerSvc.java:28) ~[classes/:na]
    at com.chakra.projects.investment.controllers.FundManagerController.getAll(FundManagerController.java:29) ~[classes/:na]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]

I am not sure what am i missing.我不确定我错过了什么。 Any pointers on how to proceed with debugging this issue?关于如何继续调试此问题的任何指示?

thanks in advance.提前致谢。

Change your Jdbi POM dependencies for jdbi3-core and jdbi3-sqlobject so they are using the same version.更改jdbi3-corejdbi3-sqlobject的 Jdbi POM 依赖项,以便它们使用相同的版本。

Currently you have version 3.19.0 for Jdbi Core - which does not contain org.jdbi.v3.core.extension.ExtensionContext .当前,您拥有 Jdbi Core 的 3.19.0 版本 - 它不包含org.jdbi.v3.core.extension.ExtensionContext

However, that class does exist in Jdbi Core version 3.35.0.然而,class确实存在于 Jdbi Core 版本 3.35.0 中。


If you remove the jdbi3-core dependency from your POM and just leave the jdbi3-sqlobject dependency, then Maven will automatically pull in the correct jdbi3-core dependency for you (it is a transitive dependency).如果您从 POM 中删除jdbi3-core依赖项并只保留jdbi3-sqlobject依赖项,那么 Maven 将自动为您引入正确的jdbi3-core依赖项(它是一个传递依赖项)。 That version of jdbi3-core will match the version of jdbi3-sqlobject .该版本的jdbi3-core将匹配jdbi3-sqlobject的版本。

You can see this in the relevant Maven Central listing.您可以在相关的Maven 中央清单中看到这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM