I has immutable class like:
@Value
public class MyEntry {
int id;
String name;
}
JDBI Developer Guide states that it should work with @Value
annotations. At least with bindBean()
or @BindBean
.
But when I use org.jdbi.v3.core.result.ResultBearing#mapToBean
method with MyEntry.class
it throws java.lang.NoSuchMethodException: no such constructor: my.company.MyEntry.<init>()void/newInvokeSpecial
. Looks like it trying create object with empty constructor and set fields after it. But I want to let my class be immutable. Any thoughts?
UPD:
lombok version: 1.18.20 jdbi version: 3.25.0 jdk: 15 and 16
Failed code:
return jdbi.withHandle(
handle -> handle.createQuery("SELECT * FROM MyTable")
.mapToBean(MyEntry.class)
.list()
);
Advertisement
Answer
JDBI documentation clearly states:
Use ConstructorMapper or @RegisterConstructorMapper to map @Value classes.
So your code might look like this (but probably there is no need to register row mapper on each call, it could be done on global level):
return jdbi.withHandle(
handle -> handle.createQuery("SELECT * FROM MyTable")
.registerRowMapper(ConstructorMapper.factory(MyEntry.class))
.mapTo(MyEntry.class)
.list()
);