2012-09-09 4 views
0

Wicket이 모델의 DropDownChoice에 대한 선택을 검색하는 방식에 문제가 있습니다.Wicket의 DropDownChoice 선택 덮어 쓰기

//User Bean 
public class Users { 
    private Long language_id; 
    public Long getLanguage_id() { 
    return language_id; 
    } 
    public void setLanguage_id(Long language_id) { 
    this.language_id = language_id; 
    } 
} 

//Language Bean 
public class Language { 
    private Long language_id; 
    private String name; 
    public Long getLanguage_id() { 
    return language_id; 
    } 
    public void setLanguage_id(Long language_id) { 
    this.language_id = language_id; 
    } 
    public String getName() { 
    return name; 
    } 
    public void setName(String name) { 
    this.name = name; 
    } 
} 

개찰구의 HTML 렌더링

<form wicket:id="form"> 
    <select wicket:id="language_id"/> 
</form> 

Jave 코드/개찰구 양식 컴파일 :

public class UserForm extends Form<Users> { 
    public UserForm(String id, Users user) { 
    add(new DropDownChoice<Language>("language_id", Application 
     .getBean(LanguageDaoImpl.class).getLanguages(), 
     new ChoiceRenderer<Language>("name", "language_id"))); 
    } 
} 

문제는 렌더링이 잘 작동한다는 것입니다, 모든 언어가를 드롭 다운 선택에서. 그러나 사용자가 폼에로드되면 Wicket은 Long 값 "language_id"에서 "language"속성을 검색하고 "클래스에 대해 get 메소드가 정의되지 않았습니다 : java.lang.Long ..."과 같은 예외를 throw합니다. Wickets는 전체 Bean "Language"를 Users 객체에 넣기를 기대합니다. 그러나 난 그냥 사용자 개체 및 전체 콩 ID가 있습니다.

개킷을 단순히 ID로만 사용할 수 있으며 전체 개체를 사용할 수 있다고 생각하지 않으려면 어떻게해야합니까? DropDownChoice에서 일부 메서드를 덮어 쓸 필요가 있다고 생각하지만 적합하지 않습니다.

감사합니다. Sebastian

+0

개찰판 버전은 무엇입니까? –

+0

Wicket 6.0.0 Beta3 (최종 ​​6.0.0과 동일해야 함) –

답변

3

language_id 필드에 Language을 설정하려고합니다. Language을 ID에 매핑하려면 IModel을 사용해야합니다. 여기에 몇 가지 작업 예제 코드는 다음과 같습니다

public class UserForm extends Form<Users> { 
    public UserForm(String id, final Users user) { 
     super(id); 
     final List<Language> l = new ArrayList<HomePage.Language>(); 
     l.add(new Language(1L, "English")); 
     l.add(new Language(2L, "German")); 
     add(new DropDownChoice<Language>("language_id", new IModel<Language>() { 
      public Language getObject() { 
       for (Language lang : l) { 
        if (lang.getLanguage_id().equals(user.getLanguage_id())) { 
         return lang; 
        } 
       } 
       return null; 
      } 

      public void setObject(Language object) { 
       user.setLanguage_id(object.getLanguage_id()); 
      } 

      public void detach() { 
      } 
     }, l, new ChoiceRenderer<Language>("name", "language_id"))); 
    } 
} 

나는 그것의 일반적인 유형은 항상 선택 목록 및 모델 유형과 동일하기 때문에 그냥 DropDownChoice의 메소드를 오버라이드 (override) 할 수 있다고 생각하지 않습니다. 즉 List<Language>DropDownChoice에 전달할 수없고 값을 변환하는 방법을 알고있는 모델이 없으면 Long이 반환 될 것으로 예상됩니다.

편집 : 또 다른 옵션은 DropDownChoice<Long>를 사용하고 언어의 이름으로 Long를 변환하는 방법을 알고있는 사용자 정의 ChoiceRenderer을 구현하는 것입니다. 나는 이것이이 경우에 가장 쉬운 해결책이라고 생각한다.

+0

팁 주셔서 감사합니다. 사용자 정의 ChoiceRenderer이 가장 ​​쉬운 옵션입니다. –