【问题标题】:Setting system property application.secret for Play and initialization order为 Play 和初始化顺序设置系统属性 application.secret
【发布时间】:2015-04-29 00:25:30
【问题描述】:

我正在使用 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 看到的值?

【问题讨论】:

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

标签: scala playframework netty


【解决方案1】:

我已经解决了初始化顺序问题,虽然它是针对我的设置的,但我想发布我的答案,以防有人遇到类似情况。

使用NettyServerComponents 时的播放配置通过这一行进行:

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

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

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

application {
  secret = "foo"
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多