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

时间:2016-04-21 11:44:00

标签: java playframework-2.0 playframework-2.5

我有两个控制器A和B.我想从B调用A的创建方法。我该怎么办?

public class A extends Controller {

    public Result create() {
        ...
    }

}

public class B extends Controller {

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

}

3 个答案:

答案 0 :(得分: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
    }

}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

只需创建共享逻辑的静态方法,并使用它为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(...)

关于params

请注意,实际上您需要在B.create(...)String param中解决的唯一参数是路径部分(A路线中的role)或者某些可选参数硬编码在每个示例中都是request

其他内容,例如sessioncacheshared(),数据库数据等,可能(应该)在shared()方法中提取。

提示:如果传递给controllers.A.shared(null, null, null, null, null, null, null, null, "foo"); 方法所需的参数数量很大而且您不想创建怪物

Map<String, Object>

只需创建DELIMITER $$ Create Procedure Sp_insertCustomer( Customer_id VARCHAR(20) , UserName VARCHAR(20), Fname VARCHAR(20), Lname VARCHAR(20), Dob Date, Address VARCHAR(250), Phone INT, Email VARCHAR(250), Ss VARCHAR(9) ) BEGIN INSERT INTO Customer (Cusomter_id, UserName, Fname, Lname, Dob, Address, Phone, Email, Ss) VALUES (Customer_id, UserName, Fname, Lname, Dob, Address, Phone, Email, Ss); END$$ 集合并立即传递所有内容或创建专用瞬态模型,该模型将所有值保存在适当的字段中。当将许多值传递给常见的Twirl模板时,第二个选项也是我的最爱。