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



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

我打的电话是:

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

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

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看到的值的其他原因?

我已经解决了初始化顺序问题,虽然它相当特定于我的设置,但我想发布我的答案,以防有人最终遇到类似情况。

使用NettyServerComponents时的播放配置通过以下行进行:

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

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

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

application {
  secret = "foo"
}

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

最新更新