播放 2.5.x java - 如何从另一个控制器调用控制器方法?

Play 2.5.x java - How to call a controller method from another controller?

我有两个控制器A和B,我想从B调用A的create方法,我该怎么做?

public class A extends Controller {

    public Result create() {
        ...
    }

}

public class B extends Controller {

    public Result create() {
        // How to call A.create() ??
    }

}

只需创建共享逻辑的静态方法并使用它为两个操作构建 Result 它将自动包含 request(),最简单的示例:

public class A extends Controller {

    public Result create(String param) {
        return shared("A role", param);
    }

    public static Result shared(String role, String param) {

        String msg = "Path: " + request().path();

        msg += ", role is: `" + role + "`";

        msg += (param == null)
                ? " and has no param"
                : ", with param: " + param;

        return ok(msg);
    }

}

public class B extends Controller {

    public Result create() {
        return controllers.A.shared("B role", null);
    }

}

关于参数

请注意,实际上您需要在 A.create(...)B.create(...) 中解析的唯一参数是路由部分(String paramA 路由中)或者可能是一些可选参数 hardcoded 在每个 like role 示例中。

其他东西,如requestsessioncache、数据库数据等,可能(应该)在shared()方法中提取。

提示:如果需要传递给 shared() 方法的参数数量很大,并且您不想创建 monsters,例如

controllers.A.shared(null, null, null, null, null, null, null, null, "foo");

只需创建 Map<String, Object> 集合并一次传递所有内容,或者创建专用的瞬态模型,将所有值保存在适当的字段中。在将许多值传递给常见的 Twirl 模板时,第二个选项也是我最喜欢的。

我认为您需要定义另一个方法来包含您的逻辑,然后从控制器的方法中调用该方法。像这样:

public class SampleController extends Controller{
     @BodyParser.Of(BodyParser.Json.class)
     public Result createMessage(){
        JsonNode json = request().body().asJson();
        return ok(createMessageLogic(json.get("id").asLong()));
    }

    public String createMessageLogic(long id){
        return "the id is " + id;
    }
}

这样,您可以轻松地将您的控制器注入另一个控制器并调用逻辑方法。但是,您可以考虑在控制器旁边放置一个服务层 类,这样更干净。

在 Play 2.5 中,由于 DI (Google Guice) 是内置的,我们可以注入所需的控制器并直接调用其方法!

public class A extends Controller {

    public Result create(String param) {
        ...
    }

}

public class B extends Controller {

    @Inject
    private A a;

    public Result create() {
        a.create("param");
        // do other stuff and return result
    }

}