我有两个控制器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() ??
}
}
答案 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
。
其他内容,例如session
,cache
,shared()
,数据库数据等,可能(应该)在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模板时,第二个选项也是我的最爱。