Как правильно внедрить play.api.Configuration внутри объекта в play framework2.5?

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

object test {
@Inject var config: Configuration = _
def portNumber = config.getInt("server.port")
}

Однако во время выполнения я получил исключение нулевого указателя, старый код был таким:

object test {
def portNumber = Play.configuration.getInt("server.port")
}

но он устарел, и я должен изменить его с помощью DI. и еще вопрос на лету, возможно ли то же самое, если у меня есть черта вместо объекта


person med10    schedule 09.08.2019    source источник


Ответы (2)


Вы можете установить конфигурацию в Singleton, например:

@Singleton
class ConfigForTest @Inject()(config: Configuration) {
  test.config = config
}

И установить отсюда config в объекте test.

Итак, ваш объект test выглядит так:

object test {
   var config: Configuration = _
   def portNumber = config.getInt("server.port")
}

Не забудьте инициализировать Singleton в Module:

class Module
  extends AbstractModule {

  @Override()
  override def configure(): Unit = {

    bind(classOf[ConfigForTest])
      .asEagerSingleton()
...

Или, как показывает Shweta, делайте это без инъекций. Поскольку у вас есть приложение Play, этого будет достаточно:

import com.typesafe.config.ConfigFactory

object test {
   val portNumber = ConfigFactory.load().getInt("server.port")
}

Это берет application.conf прямо из пути к классам.

person pme    schedule 09.08.2019
comment
Я забыл добавить его в модуль / Я также добавил версию без Injection - см. мой отредактированный ответ. - person pme; 09.08.2019
comment
Попробую с привязкой, так как файл application.conf создаю на лету, значит это файл scala - person med10; 09.08.2019
comment
но тогда вы должны убедиться, что синглтон не вызывается слишком рано! - person pme; 09.08.2019
comment
что если у меня есть Черта вместо объекта? - person med10; 09.08.2019
comment
Спасибо в Stackoverflow есть Upvote и принять ответ - тоже быстрее, чем писать комментарий ;). - person pme; 09.08.2019
comment
Во-первых, никогда не смешивайте 2 вопроса в одном. trait проблема в том, что это не синглтон, так как бы вы его инициализировали? - person pme; 09.08.2019
comment
хорошо, пожалуйста, посмотрите @ stackoverflow.com/questions/57433087/ - person med10; 09.08.2019

Другой способ сделать это

import com.typesafe.config.ConfigFactory
val restConfig = ConfigFactory.load("rest.conf") //your conf file
val pageSize = restConfig.getInt("pagesize") //the value you want from conf file
person Shweta Valunj    schedule 09.08.2019
comment
это не сработало, возможно, потому что я создаю файл .conf из файла scala - person med10; 09.08.2019
comment
В папке yonf вашего игрового фреймворка создайте файл и попробуйте. - person Shweta Valunj; 12.08.2019