在PlayFramework中访问HTTP上下文

时间:2017-10-18 15:33:09

标签: java dependency-injection playframework

我想创建一个所有控制器都可以访问的全局变量。为此,我创建了一个FrontController类,其范围从Controller开始。然后我所有常用的控制器都从这个FrontController延伸。

现在我想在country中创建一个基于主机设置的变量FrontController。我尝试从当前请求获取此信息。

我现在的问题是:如何访问当前的HTTP上下文?

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
    }
}

因为当我尝试这个时,我收到错误消息:

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

我认为问题可能出在'request()'调用上。

1 个答案:

答案 0 :(得分:2)

您可以使用action拦截对控制器中特定/所有方法的调用,并将所有必要的对象从action传递到controller

以下是一个快速的action示例:

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);
    }

}

对于controller部分:

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

有关actions

的详细信息,请参阅以下link