【问题标题】:Play framework redirection error播放框架重定向错误
【发布时间】:2012-03-03 13:13:38
【问题描述】:

在本地(在 Windows 上)开发我的测试应用时,我的应用运行良好,没有任何问题。

在部署到 heroku(使用 git)并调用特定的 GET 后,我收到了一个错误。花了很多时间尝试调试问题 - 无法在本地重现,我找到了导致它的区域(通过评论/取消评论代码区域)

这是在 heroku 上不起作用的代码:

public static  void  compose(){
        compose("");
}

public static  void  compose(String content){
        render(content);
}

将上述更改为:

 public static  void  compose(){
        String content = "";
        renderTemplate("Application/compose.html",content);
    }
    public static  void  compose(String content){
        renderTemplate("Application/compose.html",content);
    }

应用程序在heroku上运行良好

这是异常(从第一个代码段生成的异常)

Internal Server Error (500) for request GET /compose
2012-03-03T10:37:14+00:00 app[web.1]: @69hmkdf00
2012-03-03T10:37:14+00:00 app[web.1]: 
2012-03-03T10:37:14+00:00 app[web.1]: Oops: UnexpectedException
2012-03-03T10:37:14+00:00 app[web.1]: An unexpected error occured caused by exception UnexpectedException: Unexpected Error
2012-03-03T10:37:14+00:00 app[web.1]: play.exceptions.UnexpectedException: Unexpected Error
2012-03-03T10:37:14+00:00 app[web.1]: 
2012-03-03T10:37:14+00:00 app[web.1]:   at play.vfs.VirtualFile.contentAsString(VirtualFile.java:180)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.templates.TemplateLoader.load(TemplateLoader.java:69)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.templates.TemplateLoader.load(TemplateLoader.java:172)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.Controller.renderTemplate(Controller.java:640)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.Controller.render(Controller.java:695)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.Controller.renderTemplate(Controller.java:659)
2012-03-03T10:37:14+00:00 app[web.1]:   at controllers.Application.compose(Application.java:92)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
2012-03-03T10:37:14+00:00 app[web.1]:   at Invocation.HTTP Request(Play!)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.vfs.VirtualFile.inputstream(VirtualFile.java:111)
2012-03-03T10:37:14+00:00 app[web.1]:   at play.vfs.VirtualFile.contentAsString(VirtualFile.java:178)
2012-03-03T10:37:14+00:00 app[web.1]: Caused by: play.exceptions.UnexpectedException: Unexpected Error
2012-03-03T10:37:14+00:00 app[web.1]:   ... 12 more
2012-03-03T10:37:14+00:00 app[web.1]: Caused by: java.io.FileNotFoundException: /app/app/views (Is a directory)
2012-03-03T10:37:14+00:00 app[web.1]:   at java.io.FileInputStream.<init>(FileInputStream.java:137)
2012-03-03T10:37:14+00:00 app[web.1]:   at java.io.FileInputStream.open(Native Method)
2012-03-03T10:37:14+00:00 app[web.1]:   ... 13 more
2012-03-03T10:37:14+00:00 app[web.1]:   at play.vfs.VirtualFile.inputstream(VirtualFile.java:109)

路由文件相关行

* /compose Application.compose

我的问题是

  • 我做错了什么(以及为什么我所做的更改修复了它)?
  • 为什么它不能在本地复制?

【问题讨论】:

  • 这很奇怪。本地运行prod模式能重现错误吗?
  • FileNotFoundException 是针对 /app/app/views 的,这很奇怪。额外的 /app 是从哪里来的?嗯
  • @JamesWard 我在本地尝试(在生产模式下),没有重现。
  • 只是猜测,但也许在生产模式下设置http.path 可以解决问题?
  • 我尝试重新创建问题,但无法让它在本地工作。查看github.com/jamesward/playcompose,让我知道您是否可以像以前一样工作。谢谢。

标签: heroku playframework routes playframework-1.x


【解决方案1】:

上面的代码应该可以正常工作,如果你改变它;

public static  void  compose(){
        String a = "";
        compose(a);
}

public static  void  compose(String content){
        render(content);
}

因为它需要在渲染 HTML 之前为空字符串预留一些内存。

【讨论】:

    【解决方案2】:

    在 Play 框架 1.2.x 版本中,渲染方法源代码如下所示:

    protected static void render(Object... args) {
        String templateName = null;
        if (args.length > 0 && args[0] instanceof String && LocalVariablesNamesTracer.getAllLocalVariableNames(args[0]).isEmpty()) {
            templateName = args[0].toString();
        } else {
            templateName = template();
        }
        renderTemplate(templateName, args);
    }
    

    如您所见,如果第一个参数是字符串,并且它与局部变量的名称不匹配 - 它被解释为模板名称。因此,将静态空字符串作为第一个参数传递被视为使用空名称呈现模板的请求 - 因此出现“找不到文件(...是目录)”错误。

    确实有一个具有任何名称的局部变量并将该变量作为参数传递应该可以使其工作。

    好像:

    String tmp = "anything";
    render(tmp);
    

    完全不同
    render("anything");
    

    第二次调用将显式查找名为“anything”的模板。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多