0

モデル内の DropDownChoice の選択を Wicket が検索する方法に問題があります。

//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 "Language" を Users オブジェクトに入れることを期待しています。ただし、完全な Bean ではなく、Users オブジェクトに ID があるだけです。

Wicket に ID のみを使用させ、オブジェクト全体が使用可能になることを期待しないようにするにはどうすればよいですか? DropDownChoice のメソッドを上書きする必要があると思いますが、適切なものが見つかりませんでした。

ありがとう!セバスチャン

4

1 に答える 1

3

問題はLanguage、フィールドにa を設定しようとしていることですlanguage_id。を IDIModelにマップするには、 を使用する必要があります。Languageいくつかの実用的なサンプル コードを次に示します。

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メソッドのジェネリック型は常に選択肢リストとモデル型と同じであるため、メソッドを単にオーバーライドすることはできないと思います。これは、値を変換する方法を知っているモデルがなければ、 aList<Language>を a に渡して戻り値DropDownChoiceを期待することはできないことを意味します。Long

編集:別のオプションは、を使用し、を言語の名前に変換する方法を知っているDropDownChoice<Long>カスタムを実装することです。この場合、それが最も簡単な解決策だと思います。ChoiceRendererLong

于 2012-09-09T10:38:11.167 に答える