Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbi:将@MapResultAsBean注释与CustomMapperFactory一起使用_Java_Postgresql_Orm_Dropwizard_Jdbi - Fatal编程技术网

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

Java jdbi:将@MapResultAsBean注释与CustomMapperFactory一起使用,java,postgresql,orm,dropwizard,jdbi,Java,Postgresql,Orm,Dropwizard,Jdbi,我可以使用@MapResultsBean注释将jdbi查询的结果映射到我感兴趣的bean,如下所示: @SqlQuery("select * from some_table where id = :some_id") @MapResultAsBean SomeBean findById(@Bind("some_id") String someId); class CustomMapperFactory implements ResultSetMapperFactory { // Ove

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

@SqlQuery("select * from some_table where id = :some_id")
@MapResultAsBean
SomeBean findById(@Bind("some_id") String someId);
class CustomMapperFactory implements ResultSetMapperFactory {
    // Override methods to provide custom conversion logic
}
final DBIFactory factory = new DBIFactory();
final DBI jdbi = factory.build(environment, conf.getDatabase(), "postgresql");
jdbi.registerMapper(new CustomMapperFactory());
如果应用程序中使用的
jdbi
实例尚未向任何自定义映射器注册,则此方法可以正常工作

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

@SqlQuery("select * from some_table where id = :some_id")
@MapResultAsBean
SomeBean findById(@Bind("some_id") String someId);
class CustomMapperFactory implements ResultSetMapperFactory {
    // Override methods to provide custom conversion logic
}
final DBIFactory factory = new DBIFactory();
final DBI jdbi = factory.build(environment, conf.getDatabase(), "postgresql");
jdbi.registerMapper(new CustomMapperFactory());
此映射器在应用程序开始时注册到
jdbi
实例,如下所示:

@SqlQuery("select * from some_table where id = :some_id")
@MapResultAsBean
SomeBean findById(@Bind("some_id") String someId);
class CustomMapperFactory implements ResultSetMapperFactory {
    // Override methods to provide custom conversion logic
}
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

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


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

您可以通过以下几种方式来实现:

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

public class CustomResultMapperFactory implements ResultSetMapperFactory {

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

b。为
SomeBean
类型显式返回
BeanMapper

public class CustomResultMapperFactory implements ResultSetMapperFactory {

    @Override
    public ResultSetMapper mapperFor(Class type, StatementContext ctx) {
        if (type == SomeBean.class) {
            return new BeanMapper(type);
        }
        // ..
    }
}
注意,在本例中,您不需要有
@mapsresultasbean
注释