2017-10-18 35 views
0

J'aimerais créer une variable globale à laquelle tous les contrôleurs peuvent accéder. Pour cela, j'ai créé une classe FrontController qui s'étend de Controller. Tous mes contrôleurs habituels s'étendent ensuite à partir de ce FrontController.Accéder au contexte HTTP dans PlayFramework

Maintenant, je veux créer une variable country dans le FrontController qui est basé sur l'hôte. Et cette information que j'essaie d'obtenir de la demande actuelle.

Ma question est maintenant: Comment puis-je accéder au contexte HTTP actuel?

package controllers; 

import play.mvc.Controller; 

public class FrontController extends Controller { 

    // Country-Code of currenty country --> "ch", "de", "at" 
    private String currentCountry; 

    public FrontController() { 
     this.init(); 
    } 


    private void init() { 
     this.initCountry(); 
    } 


    private void initCountry() { 

     String host = request().host(); 

     // then get country from host 
    } 
} 

Parce que quand j'essaye ce que je reçois le message d'erreur:

Error injecting constructor, java.lang.RuntimeException: There is no HTTP Context available from here 

Je pense que le problème peut être la « demande() » appel.

Répondre

2

Vous pouvez utiliser un action pour intercepter l'appel à une méthode spécifique/toutes dans un contrôleur et passer les objets nécessaires du action au controller.

Voici un exemple action rapide:

public class FetchCountryAction extends play.mvc.Action.Simple { 

    public CompletionStage<Result> call(Http.Context ctx) { 
     String host = ctx.request().host(); 
     String country = getCountry(host); 
     ctx.args.put("country", country); 
     return delegate.call(ctx); 
    } 

} 

Et pour la partie controller:

@With(FetchCountryAction.class) 
public static Result sampleAction() { 
    String country = ctx().args.get("country"); 
    return ok(); 
} 

Reportez-vous à la link suivante pour plus de détails sur actions