根据 JDBI 文档https://jdbi.org/#_jackson_2,拥有对象模型的 json 属性似乎很简单,但是我尝试了以下方法,但遇到了很多问题。
DB:具有 Jsonb 列类型的 Postgres
class Event {
private String name;
@Json
private EventProperty jsonProperty;
...
}
数据源已配置
@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 并使用 Jackson ObjectMapper 和 writeValueAsString,那么我可以将它保存到 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 类型并安装插件,但似乎情况并非如此?
任何人都成功地尝试过这个,而不必定义自定义行映射器和参数工厂实现?
谢谢