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

Play 2.5.x java-如何从另一个控制器调用控制器方法?,java,playframework-2.0,playframework-2.5,Java,Playframework 2.0,Playframework 2.5,我有两个控制器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() ?? } } 只需创建共享逻辑的静态方法,并

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

}

只需创建共享逻辑的静态方法,并使用它为这两个操作自动生成
结果
,它将包含
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(…)
中解析的唯一参数是路由部分(
A
路由中的字符串参数),或者可能是在示例中的每个角色中硬编码的一些可选参数,如
角色

其他东西,如
请求
会话
缓存
,数据库数据等,可以(应该)在
共享()方法中提取

提示:如果传递到
shared()
方法所需的参数数量很大,并且您不想创建像这样的怪物


只需创建
Map
集合并一次性传递所有数据,或者创建专用的瞬态模型,将所有值保存在适当的字段中。在将许多值传递给common Twirl的模板时,第二个选项也是我的最爱。

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

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(…)
中解析的唯一参数是路由部分(
A
路由中的字符串参数),或者可能是在示例中的每个角色中硬编码的一些可选参数,如
角色

其他东西,如
请求
会话
缓存
,数据库数据等,可以(应该)在
共享()方法中提取

提示:如果传递到
shared()
方法所需的参数数量很大,并且您不想创建像这样的怪物


只需创建
Map
集合并一次性传递所有数据,或者创建专用的瞬态模型,将所有值保存在适当的字段中。在将许多值传递给common 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;
    }
}

通过这种方式,您可以轻松地将您的控制器注入到另一个控制器中,并调用逻辑方法。但是,您可以考虑将服务层放在更为干净的控制器类之外。

< P>我相信您需要定义另一种方法来包含逻辑,然后从控制器的方法调用该方法。大概是这样的:

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;
    }
}
通过这种方式,您可以轻松地将您的控制器注入到另一个控制器中,并调用逻辑方法。但是,你可以考虑在你的控制器类中有一个更干净的服务层。

< P>在游戏2.5中,由于DI(谷歌Guice)是内置的,我们可以直接注入所需的控制器并调用它的方法。p>
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
    }

}
在Play2.5中,由于内置了DI(GoogleGuice),我们可以直接注入所需的控制器并调用其方法

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
    }

}

不@Idos,你不能那样做。我们不应该初始化控制器,框架必须这样做。此外,即使我们尝试了,我们也不能将请求参数传递给该方法。我们不应该初始化控制器,框架必须这样做。此外,即使我们尝试,我们也无法将请求参数传递给该方法。谢谢!但是,如何将所需的参数传递给该控制器方法?我的意思是,“A”控制器的“create()”方法尝试从请求参数中读取数据,这可能会有所不同,因为http调用是针对“B”控制器的。您可以将任何需要的内容传递给共享方法:)请检查我的编辑。谢谢!但是,如何将所需的参数传递给该控制器方法?我的意思是,“A”控制器的“create()”方法尝试从请求参数中读取数据,这可能会有所不同,因为http调用是针对“B”控制器的。您可以向共享方法传递任何内容:)检查我的编辑。