【发布时间】:2015-04-29 00:25:30
【问题描述】:
我正在使用 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 看到的值?
【问题讨论】:
-
所以你的问题只涉及
application.secret不是任何其他任意配置键,对吗? -
我想,如果我最终以这种方式设置任何其他键,同样的问题将适用。
application.secret是目前正在说明我在代码中调用setProperty的位置很重要,我正试图找出原因 -
这似乎是由于
CryptoConfigParser的编写方式(在设置属性之前加载的单例对象中的非惰性 val)。通过使用lazy值,您可以实现缓存要求(将读取属性推迟到第一次使用)。顺便说一句,您可以使用environment variables -
令我困惑的是,只要我把它放在我的代码中,我就可以通过
setProperty进行初始化。我还没有找到将 CryptoConfig 初始化带入范围的导入。是时候深入研究 Play 源代码了
标签: scala playframework netty