为 JDBI 注册可选

Register Optional for JDBI

我收到 No container builder available for com.google.common.base.Optional 错误。

这是更完整的堆栈跟踪:

java.lang.IllegalStateException: No container builder available for com.google.common.base.Optional
    at     org.skife.jdbi.v2.ContainerFactoryRegistry.createBuilderFor(ContainerFactoryRegistry.java:75)
    at org.skife.jdbi.v2.Query.first(Query.java:271)
    at     org.skife.jdbi.v2.sqlobject.ResultReturnThing$SingleValueResultReturnThing.result(ResultReturnThing.java:112)
    at org.skife.jdbi.v2.sqlobject.ResultReturnThing.map(ResultReturnThing.java:48)
    at org.skife.jdbi.v2.sqlobject.QueryHandler.invoke(QueryHandler.java:45)
    at org.skife.jdbi.v2.sqlobject.SqlObject.invoke(SqlObject.java:175)
    at org.skife.jdbi.v2.sqlobject.SqlObject.intercept(SqlObject.java:75)
    at org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByCGLIB$$b270edb1.select(<generated>)

我有一个接口如下的 DAO:

import com.google.common.base.Optional;

public interface MyDAO {
    @SqlQuery("something")
    Optional<Data> select();
}

这是我的数据访问层单元测试:

public class MyDAOTest {
    @Test
    public void shouldSelect() {
        DBI dbi = new DBI("jdbc:(something)", "something", "something");
        MyDAO myDAO = dbi.onDemand(MyDAO.class);
        Optional<Data> data = myDAO.select();
        assertFalse(data.absent());
    }
}

如果您正在使用 com.google.common.base.Optional,请注册 io.dropwizard.jdbi.OptionalContainerFactory 并收到错误 No container builder available for com.google.common.base.Optional

如果您正在使用 java.util.Optional,请注册 io.dropwizard.java8.jdbi.OptionalContainerFactory 并收到错误 No container builder available for java.util.Optional

我遵循了说明 here:

public class MyDAOTest {
@Test
public void shouldSelect() {
    DBI dbi = new DBI("jdbc:(something)", "something", "something");
    dbi.registerContainerFactory(new OptionalContainerFactory());
    ...
}

确保您在测试代码中创建新的 io.dropwizard.java8.jdbi.DBIFactory,而不是 io.dropwizard.jdbi.DBIFactory。不幸的是,它们具有相同的名称并且(根据我的经验)很容易在导入中遗漏。