我是 Guice 的新手,并且已经阅读了很多这方面的内容,但我还没有取得任何成功。我基本上正在创建一个 DAO,并想使用 Guice 和 AssistedInjection。实际上,最终目标是在整个应用程序的其他类中创建注入(inject)工厂。
预期在实际类中使用,该类将注入(inject)工厂,然后从中获取类
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);
工厂为空。在阅读这个问题时,我被引导相信注入(inject)不会像我在“测试”类中使用它那样工作。它需要放入“注入(inject)”类本身。但这也不起作用 - 如果我将 Factory 注入(inject)包装在另一个类中,然后尝试使用它,它也不起作用。
如有任何帮助,我们将不胜感激...
最佳答案
TestAllModelBootstrap
并非来自注入(inject)器 — JUnit 创建了它 — 因此 Guice 还没有机会注入(inject)它。 Guice 只能注入(inject)到它通过 getInstance 创建的对象(以及这些对象的依赖项,递归地),或者传递到 injectMembers
的对象中。 ,或根据要求使用 requestInjection
的现有实例.
您可以手动获取工厂实例:
factory = injector.getInstance(DAOFactory.class);
或者要求 Guice 使用 injectMembers
注入(inject)您的成员:
injector.injectMembers(this); // sets the @Inject factory field
或者使用像 Guiceberry 这样的工具在您的应用程序中注入(inject)测试用例。
关于java - Guice FactoryBuilderModule 生成工厂时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591780/