Совет: использование внедренного класса в качестве локальной переменной в конструкторе по умолчанию - PullRequest
0 голосов
/ 28 августа 2018

У меня есть класс Java в файле xtend, который использует Guice, например:

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, поэтому любая помощь в понимании того, как заставить это работать, будет принята.

1 Ответ

0 голосов
/ 28 августа 2018

Я думаю, что нашел ответ на это. Я проследил происхождение ошибки до конструктора IdProvider. В своем конструкторе он получает файл с помощью getResource () примерно так:

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

Я нашел этот отчет об ошибке с тем же сообщением об ошибке, что и я. Насколько я понимаю, FileLocator будет работать, если вы используете Eclipse, но не если код / ​​тесты запускаются из командной строки (что я и делаю).

Я изменил способ получения ресурса:

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

и ошибка исчезла, поэтому я думаю, что Guice / xtend не имеет к этому никакого отношения.

...