Ошибка перенаправления игрового фреймворка - PullRequest
3 голосов
/ 03 марта 2012

При разработке моего тестового приложения локально (в Windows) мое приложение работало нормально, без проблем.

После развертывания на heroku (с использованием git) и вызова определенного GET я получил ошибку. потратив МНОГИЕ часы на отладку проблемы, которая не может быть воспроизведена локально, я нашел область, которая ее вызывает (комментируя / не комментируя области кода)

вот код, который не работал на герою:

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);
    }

приложение сработало отлично на герою

здесь - исключение (сгенерированное из первого сегмента кода)

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

Мой вопрос

  • что я сделал не так (и почему изменения я исправил)?
  • а почему не воспроизводится локально?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2013

В платформе Play version 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");

Второй вызов будет явнопоищите шаблон с именем «что угодно».

0 голосов
/ 31 июля 2012

Приведенный выше код должен работать нормально, если вы измените его следующим образом:

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

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

Поскольку перед рендерингом HTML необходимо зарезервировать часть памяти для пустой строки.

...