为播放和初始化顺序设置系统 属性 application.secret

Setting system property application.secret for Play and initialization order

我正在使用 NettyServerComponentsPlay 嵌入到我的应用程序服务器中,但我在以编程方式设置所需的 "application.secret" 时遇到了问题。

我拨打的电话是:

System.setProperty("application.secret", secret)

我可以验证它是通过 System.getProperty("application.secret") 设置的。但是,如果我将调用放在封装并启动服务器的 class 中,初始化将失败:

Exception in thread "main" @6m0lkl2h5: Configuration error
  at play.api.libs.CryptoConfigParser.get$lzycompute(Crypto.scala:235)
  at play.api.libs.CryptoConfigParser.get(Crypto.scala:204)
  at play.api.BuiltInComponents$class.cryptoConfig(Application.scala:275)
  ...

如果我在代码的前面移动相同的 setProperty 调用,它工作得很好。

是否有某些 import 游戏会导致系统属性被读取和缓存?或者其他一些原因导致它看不到我可以通过 getProperty?

看到的值

我已经解决了初始化顺序问题,虽然它对我的设置来说相当具体,但我想 post 我的答案,以防有人遇到类似情况。

使用 NettyServerComponents 时的播放配置通过此行发生:

lazy val configuration: Configuration = Configuration(ConfigFactory.load())

ConfigFactory.load()com.typesafe.config 的一部分,并在首次访问时静态初始化配置。我嵌入 Play 的守护进程也通过 net.ceedubs.ficus.FicusConfig 使用此配置,这意味着即使上面的行是惰性初始化,我的代码之前已调用 ConfigFactory.load() 进行自己的配置,这意味着设置application.secret 通过 setProperty 无效。

为了获得额外的乐趣,因为两组代码都使用 ConfigFactory.load(),我只需要输入

application {
  secret = "foo"
}

在我现有的配置文件中,Play 从那里获取它。