与 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()
);
我有不可变的 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()
);