【问题标题】:Calling static methods in Play! framework controller doesn't work在 Play 中调用静态方法!框架控制器不起作用
【发布时间】:2011-11-07 21:25:33
【问题描述】:

我有戏!具有两个包含冗余代码的操作的框架。所以我将此代码分解为private static 方法,但它不再起作用了。

  public static void show(long itemId, String listId) {
    render(getItem(itemId, listId));
  }

  private static Item getItem(long itemId, String listId) {
    // otherwise duplicate code ...
    return item;
  }

如果我将 getItem 中包含的代码内联到 show 操作中,一切都很好:

  // this works
  public static void show(long itemId, String listId) {
    Item item = // duplicate code ...
    render(item);
  }

为什么我不能在 Play 中调用其他静态方法!控制器?

解决方案

感谢“Codemwnci”,我实施了以下解决方案:

  public static void show(long itemId, String listId) {
    renderArgs.put("item", getItem(itemId, listId));
    render();
  }

我更喜欢renderArgs,因为它比局部变量更清楚意图。

【问题讨论】:

  • 请记住,如果您将辅助方法公开,则会发生重定向。见stackoverflow.com/questions/3899670/…。这不是你现在的问题,但可能是下一个问题,会发生一些神奇的事情。
  • 谢谢,我知道了。

标签: java playframework static-methods


【解决方案1】:

当你将一个局部变量传递给 render 方法时,当传递给 Groovy 视图时会使用局部变量的名称。在您的示例中,您没有传递局部变量,因此 Play 不知道为您指定的项目提供什么名称。

您有几个选择。你可以做任何一个

  1. 将 getItem 的返回设置为局部变量(item),并将 item 传递到视图中
  2. 将 getItem 的返回设置到 renderArgs 映射中,并指定您自己的名称。

选项 1 可能是最明智的。

【讨论】:

  • 这是 Play2.0 中打算解决的问题之一,但这种约定通过不必将控制器中的变量映射到视图中来显着减少代码
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多