根据JDBI文档https://jdbi.org/#_jackson_2,拥有对象模型的json属性似乎是非常直接的,但是我尝试了下面的方法,并且遇到了许多问题。
DB: Postgres的列类型为Jsonb
class Event {
private String name;
@Json
private EventProperty jsonProperty;
...
}Datasource已配置为
@Bean
public Jdbi jdbi(TransactionAwareDataSourceProxy eventStoreTxAwareDataSourceProxy) {
Jdbi jdbi = Jdbi.create(eventStoreTxAwareDataSourceProxy);
jdbi.installPlugin(new PostgresPlugin());
jdbi.installPlugin(new Jackson2Plugin());
}用于插入绑定列表的SQL
INSERT INTO event (name, json_property)
VALUES (
:name,
:jsonProperty)运行要插入的代码时,发生以下错误:
org.jdbi.v3.core.statement.UnableToCreateStatementException: no argument factory for type com.EventProperty [statement:"INSERT INTO event (...]如果我创建了EventPropertyArgumentFactory,并使用杰克逊ObjectMapper和writeValueAsString,那么我可以将它保存到DB中。但是,当从DB检索它时
try (Handle handle = jdbi.open()) {
EventDao dao = handle.attach(EventDao.class);
return dao.findByName(name);
}引发下列错误
java.lang.ClassCastException: Cannot cast org.postgresql.util.PGobject to com.EventProperty我想我所需要做的就是声明带有@Json注释的字段,DB列必须是json/jsonb类型并安装插件,但似乎并非如此?
有人成功地尝试过这一点,而不必定义自定义行映射器和参数工厂实现?
谢谢
发布于 2022-11-17 12:38:30
文件上说:
// use @Json qualifier:
...
// also works on bean or property-mapped objects:
class MyBean {
private final MyJson property;
@Json
public MyJson getProperty() { return ...; }
}我已经检查过了,这是很不幸的,但是@Json只在放置在属性(即getter或setter)上,而不是在字段上时才起作用。
如果您使用Lombok库,您可以简化您的工作。通过添加以下行修改lombok.config文件:
lombok.copyableannotations += org.jdbi.v3.json.Json现在,在bean声明中,您可以这样做:
@Data // will generate setters and getters among other things
class Event {
private String name;
@Json // will be copied onto getter and setter due to config change we made
private EventProperty jsonProperty;
...
}玩得开心!
发布于 2022-05-18 19:03:29
我不知道你现在是否已经搞清楚了,但我只是碰到了同样的问题,终于弄明白了。
基本上,您只需在类的getter或setter上添加注释,而不是顶级字段。
class Event {
private String name;
private EventProperty jsonProperty;
...
@Json
public getEventProperty() {
return jsonProperty;
}
}https://stackoverflow.com/questions/64300039
复制相似问题