我们正在使用Play 2.1.1及其内置的JPA集成(JPA.em() 等等)。
我们要避免的是必须使用重新创建EntityManager EntityManagerFactory的。我们希望继续让Play管理它 JPA助手类。
的背景 的
系统具有用于本地运行的默认数据库配置。部署到服务器时,使用以下脚本在正在运行的应用程序上动态设置DB密码:
#!/bin/bash
stty -echo
read -p "Password: " PASS
stty echo
curl -k https://127.0.0.1:8443/someUrl/pwd --data "password=$PASS"
应用程序接收此数据,然后重新创建Hibernate SessionFactory的。我们的新Play应用程序将需要执行某些操作 类似。
答案 0 :(得分:6)
关键是使用ConfigFactory创建新的Config条目。这个新配置包含一个密码条目,其值来自您对您的密码服务的http呼叫。
使用新配置创建新配置,新配置又从原始配置返回到原始配置。
基本上,新密码条目取代原始密码。
当你说出来时听起来很长,但代码很可读。
public class Global extends GlobalSettings {
// inject http client to make call for password
@Override
public Configuration onLoadConfig(Configuration configuration, File file, ClassLoader classLoader) {
final Config config = ConfigFactory.parseString(String.format("db.default.user=%s", callPasswordService()));
return new Configuration(config.withFallback(configuration.getWrappedConfiguration().underlying()));
}
}
答案 1 :(得分:2)
要回答我自己的问题,首先我们通过使用以下内容覆盖Configuration.onLoadConfig解决了在运行时更新不可变配置的问题:
但是,这仍然没有解决重新加载数据库配置的问题。最后,我的同事创造了一个Play!插件本质上是一些JPA类的副本,增加了重新加载配置属性Map的功能。
<强>更新强>
“hook”是插件添加到JPA类的附加静态方法(例如reloadWithProperties)。此方法创建一个新的数据源,然后在JNDI中反弹。