2013-03-26 83 views
1

我正在開發多租戶Play Framework 2.1應用程序。我打算覆蓋GlobalSettings類的onRequest方法,以根據請求的子域加載和設置自定義配置。問題是,我不明白在Play 2.x中這是如何實現的。Play Framework 2.1:在全局設置中以編程方式覆蓋配置文件

我可以在啓動服務器時在命令行覆蓋系統屬性,但是如何在每個請求的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和獲取/設置緩存很容易,但我無法弄清楚如何通過編程設定一個新的配置玩框架2.1和文檔是這樣的事情有點光。

有什麼想法?任何人都知道一個更好,更有效的方法來做到這一點?

+0

玩!使用TypeSafe配置庫。你可以看看它(可能會發現你在找什麼):https://github.com/typesafehub/config – 2013-03-31 14:09:02

+0

我會看看,謝謝。 – 2013-04-04 00:11:03

回答

0

因此,我以一種迂迴的方式創建了使用Scala Global的多租戶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) 
    } 

} 

然後,很明顯,你必須創建一個數據庫模型來查詢基於請求域和/或在請求設置會話值的站點。如果有人知道更好的方法,我很樂意聽到它。

+0

不幸的是,我發現了這樣的難題,即每次請求都會讀取數據庫,但我無法設置會話。看到新的問題:http://stackoverflow.com/questions/19235438/play-framework-multi-tenant-filter – 2013-10-07 21:55:37

相關問題