繁体   English   中英

播放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() ??
    }

}

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

}

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

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

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

只需创建共享逻辑的静态方法,并使用它为两个操作构建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 param是路径部分( A路径中的String param ),或者可能是一些可选参数,每个参数中都进行了硬编码在示例中的role

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

提示:如果传递到所需的PARAMS数量shared()方法大,你不想创造这样的怪物

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM