【问题标题】:return type for controller method in play framework 1.2.5播放框架 1.2.5 中控制器方法的返回类型
【发布时间】:2013-04-30 20:24:18
【问题描述】:

我正在使用播放框架 1.2.5。我正在使用从控制器调用的辅助方法(它在控制器中 - 我不确定它是否真的属于模型或其他地方)但它的返回类型是无效的。我相信这会导致控制器从该方法返回,而不是返回到调用方法(从调用助手的位置)。除了传递像 int 或 boolean 这样的返回类型,我还能做些什么来避免这个问题?

public class TestController extends Controller {

public static controllerMethod() {
helperMethod();
}

public static void helperMethod() {
    //some code 
    }

}

我猜我可以将辅助方法移动到模型中,也可以简单地将 boolean/int 作为返回类型传入 - 还有其他建议吗? 谢谢

【问题讨论】:

    标签: playframework-1.x


    【解决方案1】:

    在您的controllerMethod 中,您必须调用一些渲染方法:

    public static controllerMethod() {
      helperMethod();
      render() // or ok() to return http code 200
    }
    

    并声明您的helperMethod 为私有。将方法设为私有可防止普通控制器方法的浏览器重定向行为。

    【讨论】:

    • 我可能没有分享所有信息 - 只需调用返回 void 的 helperMethod 最终会被重定向到浏览器 - 感谢您的建议
    • 使用Play,在Controller中调用公共静态方法是重定向,所以是正常的。
    • 接受@Thierry 的回答——我也觉得汤姆也是正确的,我应该把它移出控制器。感谢两位的分享!
    • 有趣,我没有意识到将方法设为私有会改变控制器的行为。
    【解决方案2】:

    您不希望控制器类中有任何额外的辅助方法或变量!将其移至模型类(模型类甚至不必扩展模型 - 只是不要扩展控制器)。

    对控制器方法的每次调用类似于普通的 Java 方法调用。它做了很多额外的事情并强制浏览器重定向到该方法。它永远不会恢复原始方法中的代码!

    所以在控制器方法中这样的代码(其中 computeSomething 是控制器的静态方法)

      ...
      computeSomething();
      renderText("this will never be shown")
    

    您想要在控制器中调用另一个方法的唯一时间是您想要进行重定向。一个典型的例子是检查身份验证并重定向到登录页面。

    【讨论】:

    • 是的,它确实重定向了——我能避免这种情况的唯一方法是从辅助方法传递一个返回类型。我想我会将其移至模型并接受答案,除非有人提出其他解决方案 - 谢谢!
    • 一个好的经验法则是:在控制器类中放入的代码越少越好!控制器应保留为“胶水”-将所有逻辑/等保存在其他地方:)
    • 我同意 - 我懒惰和愚蠢的比例相同。感谢您指出!
    【解决方案3】:

    您可以通过使用 @Util 注释辅助方法来选择在浏览器无法访问的情况下使用辅助方法

    public class TestController extends Controller {
    
    public static controllerMethod() {
         helperMethod();
    }
    
    @Util
    protected static String helperMethod() {
        //some code 
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多