2012-03-03 2 views
3

私のテストアプリケーションをローカルで(Windows上で)開発している間、私のアプリケーションは正常に動作しました。再生フレームワークリダイレクトエラー

herokuにデプロイした後(gitを使用)、特定のGETを呼び出すとエラーが発生しました。デバッグの問題にしようと多くの時間を費やし - ローカルで再生することができない、私は(/コメント解除コード領域をコメントして)、それを引き起こした領域を見つけ、ここ

がHerokuの上のコードそのdidntの仕事です:

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の上罰金を働いた

ここ

は、例外(1が最初のコードsegmantから生成)

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) 

ルートは該当する行をファイル

* /作曲Application.compose

私の質問は

です
  • どうしたのですか(&なぜ私はそれを修正したのですか?)
  • なぜローカルで再生されないのですか?
+1

これはかなり奇妙です。 'prod'モードでローカルで実行するとエラーを再現できますか? –

+2

FileNotFoundExceptionは、/ app/app/viewsが奇妙です。追加の/ appはどこから来たのですか? hmmmm – basav

+0

@JamesWard私はローカルで(生産モードで)試しましたが、再現しませんでした。 – james

答えて

0

上記のコードは、変更するとうまくいくはずです。

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

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

HTMLをレンダリングする前に、空の文字列にいくらかのメモリを予約する必要があるためです。プレイフレームワークのバージョン1.2.xので

0

は、メソッドのソースをレンダリングするようになります:最初の引数が文字列である場合は、1つは、見ることができ、そしてそれはローカル変数の名前と一致していないとして

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

第二コールから大幅に異なっている:

はのように思えます。