我想创建一个所有控制器都可以访问的全局变量。为此,我创建了一个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()'调用上。
答案 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