jdbi:将@MapResultAsBean注释与CustomMapperFactory

时间:2018-03-15 11:59:11

标签: java postgresql orm dropwizard jdbi

我可以使用@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类型。只有这一个uber转换器才能在整个应用程序中处理所有DB到POJO的转换。

我的问题是: 我是否有办法告诉jdbi继续使用此CustomMapperFactory将结果从数据库转换为除SomeBean类型以外的所有类型的bean。 < / p>

我尝试添加@MapResultAsBean CustomMapperFactory仍在jdbi注册。该程序运行,但注册jdbi的自定义映射器优先,@MapResultAsBean完全没有效果,只是被忽略。

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

1 个答案:

答案 0 :(得分:2)

您可以通过以下几种方式完成此操作:

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

public class CustomResultMapperFactory implements ResultSetMapperFactory {

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

湾明确返回BeanMapper类型的SomeBean

public class CustomResultMapperFactory implements ResultSetMapperFactory {

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

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