我正在使用NettyServerComponents
将Play嵌入到我的应用程序服务器中,并且在以编程方式设置所需的"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 从那里拾取了它。