Heroku 播放框架重定向错误
在本地(在windows上)开发我的测试应用程序时,我的应用程序运行良好,没有问题 在部署到heroku(使用git)并调用特定GET之后,我收到了一个错误。我花了很多时间试图调试这个无法在本地重现的问题,我找到了导致它的区域(通过注释/取消注释代码区域) 以下是在heroku上不起作用的代码:Heroku 播放框架重定向错误,heroku,playframework,routes,playframework-1.x,Heroku,Playframework,Routes,Playframework 1.x,在本地(在windows上)开发我的测试应用程序时,我的应用程序运行良好,没有问题 在部署到heroku(使用git)并调用特定GET之后,我收到了一个错误。我花了很多时间试图调试这个无法在本地重现的问题,我找到了导致它的区域(通过注释/取消注释代码区域) 以下是在heroku上不起作用的代码: public static void compose(){ compose(""); } public static void compose(String
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上运行良好
以下是异常(从第一个代码segmant生成的异常)
请求获取/撰写的内部服务器错误(500)
2012-03-03T10:37:14+00:00应用程序[网站1]:@69hmkdf00
2012-03-03T10:37:14+00:00应用程序[web.1]:
2012-03-03T10:37:14+00:00应用程序[web.1]:Oops:意外异常
2012-03-03T10:37:14+00:00应用程序[web.1]:发生异常导致的意外错误意外异常:意外错误
2012-03-03T10:37:14+00:00应用程序[web.1]:play.exceptions.UnexpectedException:意外错误
2012-03-03T10:37:14+00:00应用程序[web.1]:
2012-03-03T10:37:14+00:00应用程序[web.1]:在播放中.vfs.VirtualFile.contentAsString(VirtualFile.java:180)
2012-03-03T10:37:14+00:00应用程序[web.1]:在游戏中.templates.TemplateLoader.load(TemplateLoader.java:69)
2012-03-03T10:37:14+00:00应用程序[web.1]:在游戏中.templates.TemplateLoader.load(TemplateLoader.java:172)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.Controller.renderTemplate(Controller.java:640)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.Controller.render(Controller.java:695)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.Controller.renderTemplate(Controller.java:659)
2012-03-03T10:37:14+00:00应用程序[web.1]:at controllers.Application.compose(Application.java:92)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
2012-03-03T10:37:14+00:00应用程序[web.1]:在游戏中.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
2012-03-03T10:37:14+00:00应用程序[web.1]:在游戏中.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
2012-03-03T10:37:14+00:00应用程序[web.1]:at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
2012-03-03T10:37:14+00:00应用程序[web.1]:在Invocation.HTTP请求时(播放!)
2012-03-03T10:37:14+00:00应用程序[web.1]:在播放中.vfs.VirtualFile.inputstream(VirtualFile.java:111)
2012-03-03T10:37:14+00:00应用程序[web.1]:在播放中.vfs.VirtualFile.contentAsString(VirtualFile.java:178)
2012-03-03T10:37:14+00:00应用程序[web.1]:原因:play.exceptions.Unexpected异常:意外错误
2012-03-03T10:37:14+00:00应用程序[web.1]:。。。还有12个
2012-03-03T10:37:14+00:00应用程序[web.1]:由以下原因引起:java.io.FileNotFoundException:/app/app/views(是一个目录)
2012-03-03T10:37:14+00:00应用程序[web.1]:位于java.io.FileInputStream。(FileInputStream.java:137)
2012-03-03T10:37:14+00:00应用程序[web.1]:位于java.io.FileInputStream.open(本机方法)
2012-03-03T10:37:14+00:00应用程序[web.1]:。。。还有13个
2012-03-03T10:37:14+00:00应用程序[web.1]:正在播放.vfs.VirtualFile.inputstream(VirtualFile.java:109)
路由文件相关行
*/compose Application.compose
我的问题是
- 我做错了什么(为什么我做了改变来修复它)
- 为什么它不在本地繁殖
public static void compose(){
String a = "";
compose(a);
}
public static void compose(String content){
render(content);
}
因为在呈现HTML之前,它需要为空字符串保留一些内存。在Play framework 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”的模板。这很奇怪。如果在
prod
模式下本地运行,是否可以重现错误?FileNotFoundException用于/app/app/views,这很奇怪。附加/应用程序来自哪里?hmmmm@JamesWard我在本地(在生产模式下)尝试了,但没有再现。只是猜测,但在生产模式下设置http.path
可能会解决问题?我尝试了重新创建问题,但无法使其在本地工作。检查并让我知道,如果你可以让这个工作在同样的方式,你以前做。谢谢
render("anything");