首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JDBI映射@Json属性

用JDBI映射@Json属性
EN

Stack Overflow用户
提问于 2020-10-11 02:14:46
回答 2查看 1.3K关注 0票数 6

根据JDBI文档https://jdbi.org/#_jackson_2,拥有对象模型的json属性似乎是非常直接的,但是我尝试了下面的方法,并且遇到了许多问题。

DB: Postgres的列类型为Jsonb

代码语言:javascript
复制
class Event {
    private String name;
    @Json
    private EventProperty jsonProperty;
    ...
}

Datasource已配置为

代码语言:javascript
复制
    @Bean
    public Jdbi jdbi(TransactionAwareDataSourceProxy eventStoreTxAwareDataSourceProxy) {
        Jdbi jdbi = Jdbi.create(eventStoreTxAwareDataSourceProxy);
        jdbi.installPlugin(new PostgresPlugin());
        jdbi.installPlugin(new Jackson2Plugin());
    }

用于插入绑定列表的SQL

代码语言:javascript
复制
INSERT INTO event (name, json_property)
VALUES (
        :name,
        :jsonProperty)

运行要插入的代码时,发生以下错误:

代码语言:javascript
复制
org.jdbi.v3.core.statement.UnableToCreateStatementException: no argument factory for type com.EventProperty [statement:"INSERT INTO event (...]

如果我创建了EventPropertyArgumentFactory,并使用杰克逊ObjectMapper和writeValueAsString,那么我可以将它保存到DB中。但是,当从DB检索它时

代码语言:javascript
复制
 try (Handle handle = jdbi.open()) {
    EventDao dao = handle.attach(EventDao.class);
    return dao.findByName(name);
}

引发下列错误

代码语言:javascript
复制
java.lang.ClassCastException: Cannot cast org.postgresql.util.PGobject to com.EventProperty

我想我所需要做的就是声明带有@Json注释的字段,DB列必须是json/jsonb类型并安装插件,但似乎并非如此?

有人成功地尝试过这一点,而不必定义自定义行映射器和参数工厂实现?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2022-11-17 12:38:30

文件上说:

代码语言:javascript
复制
// 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文件:

代码语言:javascript
复制
lombok.copyableannotations += org.jdbi.v3.json.Json

现在,在bean声明中,您可以这样做:

代码语言:javascript
复制
@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;
    ...
}

玩得开心!

票数 0
EN

Stack Overflow用户

发布于 2022-05-18 19:03:29

我不知道你现在是否已经搞清楚了,但我只是碰到了同样的问题,终于弄明白了。

基本上,您只需在类的getter或setter上添加注释,而不是顶级字段。

代码语言:javascript
复制
class Event {
    private String name;
    private EventProperty jsonProperty;
    ...

    @Json
    public getEventProperty() {
        return jsonProperty;
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64300039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档