在 Play 中调用静态方法!框架控制器不起作用

Posted

技术标签:

【中文标题】在 Play 中调用静态方法!框架控制器不起作用【英文标题】:Calling static methods in Play! framework controller doesn't work 【发布时间】: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,因为它比局部变量更清楚意图。

【问题讨论】:

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

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

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

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

选项 1 可能是最明智的。

【讨论】:

这是 Play2.0 中打算解决的问题之一,但这种约定通过不必将控制器中的变量映射到视图中来显着减少代码

以上是关于在 Play 中调用静态方法!框架控制器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

RPC 调用 - 静态方法不起作用

在 Play 框架 2.1.4 中将 Helpers.callAction 与没有静态方法的控制器一起使用

Google Play 开发者控制台上的 Apk 上传不起作用

Fixtures.load_Model 在 Play 框架中不起作用

在 Play 商店中发布后,Google 身份验证不起作用

QMediaPlayer 在 dll 中不起作用