Play Framework 2.1: Замяна на конфигурационния файл програмно в глобалните настройки

Работя по разработването на приложение Play Framework 2.1 с множество клиенти. Възнамерявам да отменя метода onRequest на класа GlobalSettings, за да заредя и задам персонализирана конфигурация въз основа на поддомейна на заявката. Проблемът е, че не виждам как това би било възможно в 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 и документацията е малко по-лека за неща като тези.

някакви мисли? Някой знае ли по-добър и по-ефективен начин да направите това?


person Michael Hawkins    schedule 26.03.2013    source източник
comment
Играйте! използва конфигурационната библиотека TypeSafe. Може да го разгледате (и може да намерите това, което търсите): github.com/typesafehub/config   -  person Alban Dericbourg    schedule 31.03.2013
comment
Ще погледна, благодаря.   -  person Michael Hawkins    schedule 04.04.2013


Отговори (1)


И така, по някакъв заобиколен начин, създадох основата за мултитенантно приложение Play, използвайки Scala Global. Може да има по-ефективен начин за прилагане на това с помощта на филтър, но откривам, че това изглежда работи досега. Това не изглежда да се реализира толкова лесно в 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)
  }

}

И тогава, очевидно, трябва да създадете модел на база данни, за да правите заявки към сайта въз основа на домейна на заявката и/или стойността на сесията, зададена в заявката. Ако някой знае по-добър начин, ще се радвам да го чуя.

person Michael Hawkins    schedule 04.10.2013
comment
За съжаление открих по трудния начин, че това НЕ чете базата данни при всяка заявка, но не мога да настроя сесията. Вижте нов въпрос: stackoverflow.com/questions/19235438/ - person Michael Hawkins; 08.10.2013