在 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 中调用静态方法!框架控制器不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 Play 框架 2.1.4 中将 Helpers.callAction 与没有静态方法的控制器一起使用
Google Play 开发者控制台上的 Apk 上传不起作用