播放 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() ??
}
}
只需创建共享逻辑的静态方法并使用它为两个操作构建 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
路由中)或者可能是一些可选参数 hardcoded 在每个 like role
示例中。
其他东西,如request
、session
、cache
、数据库数据等,可能(应该)在shared()
方法中提取。
提示:如果需要传递给 shared()
方法的参数数量很大,并且您不想创建 monsters,例如
controllers.A.shared(null, null, null, null, null, null, null, null, "foo");
只需创建 Map<String, Object>
集合并一次传递所有内容,或者创建专用的瞬态模型,将所有值保存在适当的字段中。在将许多值传递给常见的 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;
}
}
这样,您可以轻松地将您的控制器注入另一个控制器并调用逻辑方法。但是,您可以考虑在控制器旁边放置一个服务层 类,这样更干净。
在 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
}
}
我有两个控制器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() ??
}
}
只需创建共享逻辑的静态方法并使用它为两个操作构建 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
路由中)或者可能是一些可选参数 hardcoded 在每个 like role
示例中。
其他东西,如request
、session
、cache
、数据库数据等,可能(应该)在shared()
方法中提取。
提示:如果需要传递给 shared()
方法的参数数量很大,并且您不想创建 monsters,例如
controllers.A.shared(null, null, null, null, null, null, null, null, "foo");
只需创建 Map<String, Object>
集合并一次传递所有内容,或者创建专用的瞬态模型,将所有值保存在适当的字段中。在将许多值传递给常见的 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;
}
}
这样,您可以轻松地将您的控制器注入另一个控制器并调用逻辑方法。但是,您可以考虑在控制器旁边放置一个服务层 类,这样更干净。
在 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
}
}