我正在开发一个 Multi-Tenancy Play Framework 2.1 应用程序。我打算重写 GlobalSettings 类的 onRequest 方法,以根据请求的子域加载和设置自定义配置。问题是,我不明白这在 Play 2.x 中如何可能。
启动服务器时,我可以在命令行覆盖系统属性,但如何在 Java 代码中以编程方式为每个请求执行此操作?
代码看起来像这样(我假设):
@Override
public play.mvc.Action onRequest(Request request, Method actionMethod) {
//Look up configuration settings in Cache based on request subdomain
//(i.e. Cache.get("subdomain.conf"))
//if not in cache:
//load appropriate configuration file for this subdomain (java.io.File)
//set new configuration from file for this request
//cache the configuration for future use in a new thread
//else
//set configuration from cache for this request
return super.onRequest(request, actionMethod);
}
}
查找 URL 并获取/设置缓存很容易,但我无法弄清楚如何以编程方式为 Play Framework 2.1 设置新的配置,并且文档对此类事情有一些了解。
有什么想法吗?有人知道更好、更有效的方法吗?
最佳答案
因此,我以一种迂回的方式使用 Scala Global 创建了 Multi-Tenancy Play 应用程序的基础。可能有一种更有效的方法来使用过滤器来实现此目的,但我发现到目前为止这似乎有效。这在 Java 中似乎并不容易实现。
我没有使用配置文件,而是使用数据库。我认为使用键值缓存会更有效,但这似乎目前有效。
在 Global.scala 中:
object Global extends GlobalSettings {
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
if (request.session.get("site").isEmpty){
val id = models.Site.getSiteIDFromURL(request.host)
request.session.+("site" -> id)
}
super.onRouteRequest(request)
}
}
然后,显然,您必须创建一个数据库模型来根据请求域和/或请求中设置的 session 值来查询站点。如果有人知道更好的方法,我很乐意听到。
关于java - Play Framework 2.1 : Overriding configuration file programmatically in Global settings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649207/