I can save data into postgres using jsonConverter with following setting
<forcedType>
<userType>java.util.List<com.sify.MyType></userType>
<jsonConverter>true</jsonConverter>
<includeExpression>table\.field</includeExpression>
</forcedType>
However, if I select data from postgres, jsonb columns aren't converted to the List<MyType>. It reports error: class org.jooq.JSONB cannot be cast to class java.util.List, when calling TableRecord.getField() method.
Edit: I tried using a custom binding like this: https://github.com/jOOQ/jOOQ/issues/9679, the behavior is the same
Edit: I checked the generated code, TableRecord.getField() is just
public List<Field> getField() {
return (List<Field>) get(12);
}
Maybe it should be get(12, (Class<List<Field>>) (Class<?>) List.class) instead?
jOOQ cannot pass along a Class<List<MyType>> reference to Jackson, because the generics are erased by the Java compiler, so Jackson will simply receive Class<List>. This is different if you map your JSONB document to a com.sify.MyType[] array type, which is still available at runtime.
I don't think there will be an easy solution using the out-of-the-box JSONBtoJacksonConverter implementation in jOOQ 3.20, but do have a look at its implementation. You can probably easily implement a Converter<JSONB, List<MyType>> by working with the Jackson API directly.
For a future version of jOOQ, there might be an out-of-the-box heuristic that tries to pass List type information to Jackson CollectionType, or similar: