【问题标题】:NoSuchMethodException in JDBI while using it with Lombok与 Lombok 一起使用 JDBI 中的 NoSuchMethodException
【发布时间】:2022-01-10 11:59:12
【问题描述】:

我有不可变的类,例如:

@Value
public class MyEntry {
    int id;
    String name;
}

JDBI Developer Guide 声明它应该与@Value 注释一起使用。至少有bindBean()@BindBean

但是当我将org.jdbi.v3.core.result.ResultBearing#mapToBean 方法与MyEntry.class 一起使用时,它会抛出java.lang.NoSuchMethodException: no such constructor: my.company.MyEntry.<init>()void/newInvokeSpecial。看起来它尝试使用空构造函数创建对象并在其后设置字段。但我想让我的类是不可变的。有什么想法吗?

更新:

龙目岛版本:1.18.20 jdbi 版本:3.25.0 jdk:15 和 16

失败的代码:

return jdbi.withHandle(
    handle -> handle.createQuery("SELECT * FROM MyTable")
        .mapToBean(MyEntry.class)
        .list()
);

【问题讨论】:

  • 请提供JDBI/Lombok 版本和JDBI 调用的完整示例。
  • @YuriiMelnychuk 完成

标签: java lombok jdbi


【解决方案1】:

JDBI documentation 明确指出:

使用 ConstructorMapper 或 @RegisterConstructorMapper 映射 @Value 类。

所以你的代码可能看起来像这样(但可能不需要在每次调用时注册行映射器,它可以在全局级别完成):

return jdbi.withHandle(
    handle -> handle.createQuery("SELECT * FROM MyTable")
        .registerRowMapper(ConstructorMapper.factory(MyEntry.class))
        .mapTo(MyEntry.class)
        .list()
);

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多