3

根据 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 类型并安装插件,但似乎情况并非如此?

任何人都成功地尝试过这个,而不必定义自定义行映射器和参数工厂实现?

谢谢

4

0 回答 0