2012-09-09 75 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> 

java的呈現代碼/編譯檢票形式:

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」,並拋出一些異常,如「No get method for class:java.lang.Long ...」 Wickets希望我把完整的Bean「Language」放在Users對象中。不過,我只在用戶對象中有ID,而不是完整的Bean。

如何讓Wicket使用簡單的ID並且不期望整個對象可用?我想我需要在DropDownChoice中覆蓋一些方法,但是我找不到任何合適的方法。

謝謝! 塞巴斯蒂安

+0

哪個導葉版本? –

+0

Wicket 6.0.0 Beta3(所以應該與6.0.0 Final相同) –

回答

3

問題是,您正試圖在字段language_id中設置Language。您需要使用IModelLanguage映射到該ID。下面是一些工作示例代碼:

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,因爲這種類型的它總是一樣的選擇列表和型號。這意味着您無法將List<Language>傳遞給DropDownChoice,並且期望獲得Long而沒有知道如何轉換值的某個模型。

編輯:另一種選擇是使用DropDownChoice<Long>並實現自定義ChoiceRenderer它知道如何將Long轉換成語言的名稱。我認爲這是最簡單的解決方案。

+0

感謝您的提示,自定義ChoiceRenderer絕對是最簡單的選擇。 –