2012-09-09 45 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绝对是最简单的选择。 –