Как сделать метод / инъекцию поля в Scala, используя Guice? - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь сделать метод или полевую инъекцию в Scala.Я использую Play Framework, который использует Guice для инъекций.Я пробовал полевую инъекцию как:

@Inject val cache: DefaultSyncCacheApi = null

как подробно здесь , но всякий раз, когда я пытаюсь проверить это, я получаю NullPointerException.Я также попробовал метод инъекции, например:

@Inject
def method(id: String, cache: DefaultSyncCacheApi): Boolean = {
   val cachedItem = cache.get(id)
   cachedItem.isDefined
}

, но безрезультатно.Пришлось бы перейти в кеш и из другого места.

Я также пытался использовать перегруженные методы и инъекции отдельно, такие как:

val cache: DefaultSyncCacheApi //this will not work if it is not an abstract class

@Inject //either injecting here
def methodA(id: String): Boolean = {
   methodB(string, cache)
}

@Inject //or injecting here
def methodB(id: String, cache: DefaultSyncCacheApi): Boolean = {
   //same logic as 'method' above
}

безрезультатно.Есть ли четкий способ сделать метод или полевую инъекцию, не вызывая NPE?

1 Ответ

0 голосов
/ 01 июня 2019

Возможно, ваша проблема в том, что эти поля вводятся слишком рано (до того как Guice настроит приложение).

Итак, вы можете изменить все val с на lazy val с.

Я должен сказать, что я использую только инъекцию в конструкторе, который работает отлично. Ваш пример

class HomeController @Inject()(id: String, cache: DefaultSyncCacheApi)

Однако для id вам понадобится поставщик в вашем модуле. И так как это строка, вы должны назвать это. Вот пример:

Module.scala

  @Provides
  @Named("myIdentitfier")
  def provideId(): String = {
    IdCreator.nextId().
  }

HomeController.scala

class HomeController @Inject()(@Named("myIdentitfier") id: String, cache: DefaultSyncCacheApi)
...