コンバーターとバインディングの問題で立ち往生しています。オブジェクトのリストを itemValue にバインドする form:select のあるページがあります
<form:select id="id_a" items="${items}" path="builder" itemValue="id" />
この Bean を変換する 2 つのコンバーターを作成しました。1 つは Bean から説明を表示する文字列に変換し、もう 1 つは ID から変換して DB から Bean を取得します。
private Converter<BuilderType, String> getBuilderTypeToStringConverter(){
return new Converter<BuilderType, String>(){
public String convert(BuilderType builder){
return builder.getDescription();
}
};
}
private Converter<String,BuilderType> getStringToBuilderTypeConverter(){
return new Converter<String, BuilderType>(){
public BuilderType convert(String id){
return builderService.findById(new Long(id));
}
};
}
そのため、Bean を作成するとすべてが正常に機能し、選択フィールドに説明が表示され、フォームを送信すると、ID が実際の Bean に変換され、コントローラーに到達する前にモデル属性に入れられます。
問題は、更新しようとすると、選択したものが正しく入力されているのに、実際の値が選択されていないことです。選択を正しく初期化するための「選択済み」属性のオプションはありません。
実際には同じタイプのコンバーターを使用して選択を正しく入力する春のルーのサンプル アプリケーション (petclinic) があるため、これは非常に奇妙です。
これを機能させる唯一の方法は、パスに「.id」を追加することです。
<form:select id="id_a" items="${items}" path="builder.id" itemValue="id" />
しかし、この方法で送信すると、正しいコンバーターが呼び出されたときに通常受け取る完全なオブジェクトではなく、ID のみが設定された空の「ビルダー」がコントローラーに返されます。
2つのアプリケーションの違いが何であり、一方が機能し、他方が機能しないのか、私には本当にわかりません...春のライブラリのバージョンでさえ同じです!