2012-03-21 4 views
1

내가 요청에 폼을 바인딩하기 위해 노력하고있어 바인딩하지만 다음과 같은 오류와 함께 실패 : 오류 설명이 정직하고 단순한 것재생! 프레임 워크 형태로 오류

Execution exception 
[RuntimeException: Cannot instantiate class controllers.Application$RequestData. It must have a default constructor] 

하지만, 코드를 찾고 :

public class RequestData { 
    @Required 
    public String id; 

    public RequestData() { } 

    public RequestData(String id) { 
     this.id = id; 
    } 
} 

public static Result index() { 
    ... 
    Form<RequestData> requestDataForm = form(RequestData.class); 
    RequestData requestData = requestDataForm.bindFromRequest().get(); 
    ... 
} 

실제로 클래스에 기본 생성자가 있으므로이 오류가 전혀 분명하지 않다는 것을 알 수 있습니다.

아이디어가 있으십니까? 감사합니다. .


편집

무엇 재밌어요 것은 official documentation에, 그들이 사용하는 예는 기본 생성자가없는 것입니다.

+0

컴파일러에서 빈 생성자를 볼 때 '최적화 된 것'이됩니까? 기억하십시오. 그것은 바이트 코드가 아니라 소스에 불과합니다. – Mikaveli

+0

음, 왜 그런 일이 일어 났을까요? 그리고 더 중요한 것은 어떻게 알 수 있습니까? –

답변

5

오류 메시지에서 RequestData 클래스가 Application 클래스의 내부 클래스 인 것처럼 보입니다.이 경우 RequestData가 정적이 아니기 때문에 Application 인스턴스는 RequestData의 인스턴스를 만드는 데 필요합니다. 이 권한이 있으면 RequestData 자체 클래스로 만들거나 내부 클래스로 유지하려면 정적 내부 클래스로 만듭니다.

+0

아 ... 고마워! 정적 인 인스턴스를 가지기로 결정했다면, (뷰에 대한) 모든 요청은 같은 인스턴스를 사용할 것인가? 조금 문제가되지 않습니까? –

+1

정적 * 인스턴스 *는 스레드 안전성에 문제가 있습니다. 예. 제가 말하고자하는 것은 내부 클래스에 대한 정적 클래스 정의입니다. "class"키워드 앞에 "static"키워드를 넣기 만하면됩니다. – RichW

+0

그래, 나는 그 부분을 가지고 있고, 클래스 정의를 자신의 파일로 가져 가기로 결정했다. 그러나 다음을 보았다. * final static Form signupForm = form (User.class); * 제공된 중 하나에 * 예를 들어 이것에 대해 물어볼 생각입니다. –