0

我对 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>

呈现/编译 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”并抛出一些异常,例如“No get method defined for class: java.lang.Long ...” Wickets 希望我将完整的 Bean“语言”放入 Users 对象中。但是,我只有用户对象中的 ID,而不是完整的 Bean。

我怎样才能让 Wicket 只使用 ID 而不是期望整个对象都可用?我想我需要覆盖 DropDownChoice 中的一些方法,但我找不到合适的方法。

谢谢!塞巴斯蒂安

4

1 回答 1

3

问题是您试图Language在字段中设置 a 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因为它的泛型类型始终与选择列表和模型类型相同。这意味着您不能将 a 传递List<Language>给 aDropDownChoice并期望在Long没有知道如何转换值的模型的情况下得到回报。

编辑:另一种选择是使用 aDropDownChoice<Long>并实现一个自定义ChoiceRenderer,它知道如何将其转换Long为语言的名称。我认为这是在这种情况下最简单的解决方案。

于 2012-09-09T10:38:11.167 回答