1

我有两个控制器 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() ??
    }

}
4

3 回答 3

3

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

}
于 2016-06-20T10:52:35.420 回答
1

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

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

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

于 2016-05-02T18:38:42.500 回答
0

只需创建共享逻辑的静态方法并使用它来构建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路由中),或者可能是一些可选参数硬编码在每个role示例中。

可以(应该)在该方法中提取其他内容,例如requestsessioncache、 DB 数据等。shared()

提示:如果传递给该shared()方法所需的参数数量很大并且您不想创建类似的怪物

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

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

于 2016-04-21T15:05:26.610 回答