首页 > 解决方案 > Guice:在默认构造函数中使用注入的类作为局部变量

问题描述

我在使用 Guice 的 xtend 文件中有一个 Java 类,如下所示:

class myClass {
  @Inject private extension classA
  @Inject private extension classB

  // methods
  // ...
}

我想添加一个整数字段并修改默认构造函数以使用帮助器类 IdProvider 设置它,执行如下操作:

import some.package.IdProvider

class myClass {
  @Inject private extension classA
  @Inject private extension classB

  private long mMaxId

  new() {
    var IdProvider provider
    mMaxId = provider.getMaxId("Student")
  }

  // methods
  // ...
}

但是这不起作用,我收到此错误:

com.google.inject.ProvisionException:Guice 配置错误。注入构造函数时出错,java.lang.NullPointerException

我也试过这个,但我得到了同样的错误:

import some.package.IdProvider

class myClass {
  @Inject private extension classA
  @Inject private extension classB

  private long mMaxId
  @Inject private IdProvider provider

  new() {
    mMaxId = provider.getMaxId("Student")
  }

  // methods
  // ...
}

我是 xtend 和 Guice 的新手,所以任何帮助理解如何让它工作将不胜感激。

标签: javaguicextend

解决方案


我想我找到了答案。我将错误的根源追踪到 IdProvider 的构造函数。在其构造函数中,它使用 getResource() 获取一个文件,如下所示:

URL theResource = getClass().getResource("aFile.txt");
File aFile = new File(FileLocator.toFileURL(theResource).getPath());

我发现这个错误报告与我看到的错误消息相同。我的理解是,如果您使用 Eclipse,FileLocator 将起作用,但如果代码/测试是从命令行运行的(这就是我正在做的),则不会。

我已经改变了获取资源的方式:

InputStream theResource = getClass().getResourceAsStream("aFile.txt");

并且错误已经消失,所以我认为 Guice/xtend 与它无关。


推荐阅读