gpt4 book ai didi

java - 覆盖 Wicket 中 DropDownChoice 的选择

转载 作者:行者123 更新时间:2023-12-02 00:13:24 25 4
gpt4 key购买 nike

我对 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 就会在长值“language_id”中搜索属性“语言”并抛出一些异常,例如“没有为类定义 get 方法:java.lang.Long ...”Wickets 希望我将完整的 Bean“语言”放入 Users 对象中。但是我只有 Users 对象中的 ID,而不是完整的 Bean。

如何让 Wicket 仅使用 ID,而不期望整个对象可用?我想我需要覆盖 DropDownChoice 中的一些方法,但我找不到任何合适的方法。

谢谢!塞巴斯蒂安

最佳答案

问题是您正在尝试设置 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到语言的名称。我认为这是这种情况下最简单的解决方案。

关于java - 覆盖 Wicket 中 DropDownChoice 的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com