【问题标题】:Play 2.5.x java - How to call a controller method from another controller?Play 2.5.x java - 如何从另一个控制器调用控制器方法?
【发布时间】:2016-06-20 18:52:35
【问题描述】:

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

}

【问题讨论】:

  • 不@Idos,你不能那样做。我们不应该初始化控制器,框架必须这样做。此外,即使我们尝试了,我们也无法将请求参数传递给该方法。

标签: java playframework-2.0 playframework-2.5


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      只需创建共享逻辑的静态方法并使用它为两个操作构建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 paramA 路由中)或者可能是一些可选参数硬编码在每个喜欢role 的例子中。

      其他内容,如requestsessioncache、数据库数据等,可以(应该)在shared()方法中提取。

      提示:如果传递给shared() 方法所需的参数数量很大,并且您不想像

      那样创建 monsters
      controllers.A.shared(null, null, null, null, null, null, null, null, "foo");
      

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

      【讨论】:

      • 谢谢!但是,如何将所需的参数传递给该控制器方法?我的意思是,“A”控制器的“create()”方法试图从请求参数中读取数据,这可能会有所不同,因为 http 调用是针对“B”控制器的。
      • 你可以将任何你想要的东西传递给共享方法:) 检查我的编辑。
      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多