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() を
このようにオーバーライドしておかないと、
想定どおりに、テキストが表示されないので注意したいところ。