2016-10-06 2 views
0

В playframework < 2.5 мы можем использоватьНевозможно прочитать конф файл в playframework 2.5

val value = Play.current.configuration.getString("confKey") 

, но в версии 2.5 мы предупредив

метод тока в объекте Play осуждается: Это статический ссылка на приложение, используйте DI вместо

package tmp 

object TmpObj { 
    val confVal = ??? // read key-value from application.conf or *.conf 
} 

Итак, мой вопрос is - «Как я могу прочитать conf из любого объекта в проекте, использующего DI

Пожалуйста, помогите мне понять, что я должен написать в ??????, чтобы получить значение из application.conf или другого somePath/file.conf

import javax.inject.Inject 
import play.api.Configuration 

class AppConfig @Inject() (configuration: play.api.Configuration) { 
    val someConfValue = configuration.underlying.getString("someConfValue") 
} 

object ConfigReader extends AppConfig(??????) { 
    def getSomeConfValue() = someConfValue 
} 

println(ConfigReader.getSomeConfValue()) 
+0

В чем проблема, которую вы пытаетесь решить? Кроме того, 'object' не хорошо сочетается с Injection Dependency. – marcospereira

+0

@marcospereira в объекте, например ... - val mongoClient = MongoClient ('hostFromConfig',' portFromCOnfig') –

ответ

0

для этого я создал файл услуги/ConfigReader.scala

package services 

import javax.inject.Inject 
import play.api.{Configuration, Environment} 

class AppConfig @Inject()(playConfig: Configuration) { 
    val dbHost: Option[String] = playConfig.getString("mydb.host") 
    val dbPort: Option[Long] = playConfig.getLong("mydb.port") 
} 

object ConfigReader { 
    val config = new AppConfig(Configuration.load(Environment.simple())) 
    def getDbHost: String = config.dbHost.getOrElse("localhost") 
    def getDbPort: Long = config.dbPort.getOrElse(27017) 
} 

Я prescrib в конф/application.conf

mydb { 
    host = 192.168.0.0 
    port = 1234 
} 

, и я имел возможность получить доступ к конфигурации из любого места путем импорта моего ConfigReader, например, в контроллер

package controllers 

import play.api.mvc._ 
import services.ConfigReader 

class SomeCtrl extends Controller { 
    def index = Action { request => 
    Ok(ConfigReader.getDbHost + ":" + ConfigReader.getDbPort.toString) 
    } 
} 

его работа отлично, бу t я все еще хочу сделать это от myconf/myconf.conf и ищет способ

0

Поскольку AppConfig требует «конфигурации» объекта, его создание экземпляра требует, чтобы объект. Наличие нотации @Inject() просто сообщает структуре DI, что она должна обеспечивать эту зависимость во время компиляции.

Итак, есть два способа решить, что вы пытаетесь достичь: Вместо определения объекта определить класс ConfigReader:

class ConfigReader(config: play.api.Configuration) extends AppConfig(config) { 
    def getSomeConfValue() = someConfValue 
} 

Или так как вы ввели рамки DI, дайте ему обрабатывать все зависимости для вас ,

class ConfigReader @Inject() (appConfig: AppConfig) { 
    def getSomeConfValue() = appConfig.someConfValue 
} 

Тогда, где ConfigReader необходимо инъекционные, что тоже.

+0

Мне нужен объект ConfigReader не класс, в любом случае мой вопрос все еще остается о том, что я должен перенести на новый ConfigReader (??? ????), чтобы получить application.conf или любой * .conf –

Смежные вопросы