読者です 読者をやめる 読者になる 読者になる

Wicket AutoCompleteTextField テキスト入力取得

Wicket AutoCompleteTextField を使う場合、

Bean オブジェクトで使用する時、入力テキストフィールドに入力された文字列を
String として取得したい場合、getModelObject() のログを出せば確かに
見れるのだが、これを String オブジェクトには cast できない!

例)
// AutoCompleteにする Object
public class Customer implements Serializable{
   public int id;
   public String customer_name;
   
   public Customer(){ }
   
   public Customer(int id, String name){
      this.id = id;
      customer_name = name;
   }
   
   @Override //・・・(※1)
   public String toString(){
      return customer_name;
   }

}

public class CustomerAutocomplete extends AutoCompleteTextField<Customer>{
   private String hiddenId;

   public CustomerAutocomplete(String id, String hiddenId, IModel<Customer> model){
      super(id, model);
      this.hiddenId = hiddenId;
      // DBから Customer を検索する準備をしておく。
   }
   @Override
   protected void onSelected(AjaxRequestTarget target){


      // Hidden フィールドに、id 値 をセットする。

      target.appendJavaScript("$('#" + hiddenId + "').val(" + this.getModelObject().id + ");");
   }

   @Override
   protected List<Customer> getChoices(String input){
      if (Strings.isEmpty(input)) return Collections.emptyList();

      
      // ここで、input の内容で、DBから Customer を検索して Customer リストを返す。
   }

}

たいてい、Hidden にセットされるものを使用するから、
入力された文字列を任意のObject に格納することはめったにないのだが、
getModelObject() で 任意のString に格納するのに、、

getModelObject().customer_name でもダメなのである。


AutoCompleteTextField の getInput() でもなく、

AutoCompleteTextField の getValue() で取得して、String に格納することができる。



AutoCompleteにする Object で書いた (※1)toString() を
このようにオーバーライドしておかないと、
想定どおりに、テキストが表示されないので注意したいところ。