2012-03-03 8 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가에 벌금을했다

,여기

예외

가 */

내 질문

입니다 Application.compose를 구성 (첫 번째 코드 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) 

이 경로는 파일 관련 라인

  • 내가 뭘 잘못 했습니까 (& 내가 왜 그것을 고쳤 을까?)
  • 왜 로컬에서 재생산되지 않습니까?
+1

꽤 이상합니다. 'prod' 모드에서 로컬로 실행하면 에러를 재현 할 수 있습니까? –

+2

FileNotFoundException은 이상한/app/app/views입니다.추가 앱은 어디서 나왔습니까? 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

는 방법 소스는 다음과 같습니다 렌더링 :

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

두 번째 호출에서 크게 다릅니다

는 것 같다.