与 Lombok 一起使用时 JDBI 中的 NoSuchMethodException

NoSuchMethodException in JDBI while using it with Lombok

我有不可变的 class 比如:

@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。看起来它正在尝试使用空构造函数创建对象并在其后设置字段。但我想让我的 class 不可变。有什么想法吗?

更新:

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

失败代码:

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

JDBI documentation明确指出:

Use ConstructorMapper or @RegisterConstructorMapper to map @Value classes.

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

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