gpt4 book ai didi

java - jdbi:将@MapResultAsBean 注释与 CustomMapperFactory 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:55 25 4
gpt4 key购买 nike

我可以使用 @MapResultAsBean 注释将 jdbi 查询的结果映射到我感兴趣的 bean,如下所示:

@SqlQuery("select * from some_table where id = :some_id")
@MapResultAsBean
SomeBean findById(@Bind("some_id") String someId);

如果应用程序中使用的 jdbi 实例尚未注册到任何自定义映射器,则此方法工作正常。

但是我正在处理的应用程序有一个自定义映射器,如下所示:

class CustomMapperFactory implements ResultSetMapperFactory {
// Override methods to provide custom conversion logic
}

此映射器在应用程序开始时注册到 jdbi 实例,如下所示:

final DBIFactory factory = new DBIFactory();
final DBI jdbi = factory.build(environment, conf.getDatabase(), "postgresql");
jdbi.registerMapper(new CustomMapperFactory());

CustomMapperFactory 覆盖方法并提供将任何类型的结果从数据库转换为相关 bean 类型的逻辑。正是这个 super 转换器负责处理整个应用程序中所有 DB 到 POJO 的转换。

我的问题是:有没有一种方法可以告诉 jdbi 继续使用此 CustomMapperFactory 将结果从数据库转换为所有类型的 bean,SomeBean< 类型除外.

我尝试添加 @MapResultAsBean,但 CustomMapperFactory 仍向 jdbi 注册。程序运行,但是使用 jdbi 注册的自定义映射器优先,而 @MapResultAsBean 根本没有效果,只是被忽略了。

在互联网上找不到太多相关信息。有什么帮助吗?我们使用 dropwizard-jdbi-1.2.2 显然是 postgres 数据库。

最佳答案

您可以通过几种方式做到这一点:

一个。告诉 JDBI 您的 CustomMapperFactory 没有映射 SomeBean 类型。这样,JDBI 将回退到使用 @MapResultAsBean:

public class CustomResultMapperFactory implements ResultSetMapperFactory {

@Override
public boolean accepts(Class type, StatementContext ctx) {
if (type == SomeBean.class) {
return false;
}
//....
}
}

SomeBean 类型显式返回 BeanMapper:

public class CustomResultMapperFactory implements ResultSetMapperFactory {

@Override
public ResultSetMapper mapperFor(Class type, StatementContext ctx) {
if (type == SomeBean.class) {
return new BeanMapper(type);
}
// ..
}
}

请注意,在这种情况下,您不需要使用 @MapResultAsBean 注释。

关于java - jdbi:将@MapResultAsBean 注释与 CustomMapperFactory 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49298917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com