Guice FactoryBuilderModule NullPointerException生成的工厂

时间:2014-02-06 00:44:27

标签: java dependency-injection guice factory

我是Guice的新手并且已经对此做了很多阅读,但我没有取得任何成功。我基本上创建了一个DAO,并希望使用Guice和AssistedInjection。实际上,最终目标是在整个应用程序的其他类中创建Injected工厂。

在实际类中的预期用途,它将注入工厂然后从中获取类

public class TestAllModelBootstrap {
   @Inject private DAOFactory factory;
   public TestAllModelBootstrap() {
   }

   @Test
   public void testGettingDAO() {
      Injector injector = Guice.createInjector(new HibernateDAOModule());
      Token oToken = new OperTokenV1();
      AccountingDAO accountingDAO = factory.create(oToken);
   }
}

这是基于基于Guice的代码:

public interface DAOFactory {
    public AccountingDAO create(Token oTicket);
}

具体类有一个构造函数已经消息

@Inject
public HibernateAccountingDAO(@Assisted Token oTicket) {

    this.oTicket = oTicket;
}

实际模块:

@Override
protected void configure() {
    install(new FactoryModuleBuilder()
            .implement(AccountingDAO.class, HibernateAccountingDAO.class)
            .build(DAOFactory.class));

    bind(SessionFactoryInterface.class)
            .toProvider(HibernateSessionProvider.class);
}

每次我尝试运行此操作: java.lang.NullPointerException - >表明:

factory.create(oToken);

将工厂设为null。在阅读这个问题时,我开始相信注射不会像我在“测试”课中使用它那样起作用。它本身需要放入“注入”类。但这也不起作用 - 如果我将Factory注入包装在另一个类中然后尝试使用它,它就不起作用。

任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:2)

TestAllModelBootstrap并非来自Injector-JUnit而是创建了它 - 所以Guice还没有机会注入它。 Guice只能通过getInstance(以及递归的那些对象的依赖关系)或传递到injectMembers的对象或使用requestInjection请求的现有实例注入它创建的对象。

您可以手动获取工厂实例:

factory = injector.getInstance(DAOFactory.class);

或者让Guice使用injectMembers注入您的会员:

injector.injectMembers(this); // sets the @Inject factory field

或者使用像Guiceberry这样的工具在您的应用中注入测试用例。