我对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;
}
}
Wicket HTML
<form wicket:id="form">
<select wicket:id="language_id"/>
</form>
渲染/编译Wicket表格的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 ...” Wickets希望我将完整的Bean“语言”放在Users对象中。但是我只是在Users对象中有ID而不是完整的Bean。
如何让Wicket只使用ID,而不是期望整个对象可用?我想我需要覆盖DropDownChoice中的一些方法,但我找不到任何合适的方法。
谢谢! 塞巴斯蒂安
答案 0 :(得分:3)
问题是您要在字段Language
中设置language_id
。您需要使用IModel
将Language
映射到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
转换为语言名称。在这种情况下,我认为这是最简单的解决方案。