2

コンバーターとバインディングの問題で立ち往生しています。オブジェクトのリストを 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つのアプリケーションの違いが何であり、一方が機能し、他方が機能しないのか、私には本当にわかりません...春のライブラリのバージョンでさえ同じです!

4

2 に答える 2

2

問題が見つかりました。作業中のアプリケーションの web.xml には、使用していない別のフィルターがあったようです。これを追加するだけで、すべてが正常に機能しました。

<filter>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

これが必須である、または期待どおりに機能させるためのスプリングタグとの関連性がほとんどないことをどこにも見つけていないので、それは本当に奇妙です!

于 2012-11-29T14:05:43.480 に答える
0

エンティティクラス(BuilderType)にequalsメソッドを定義し、idでインスタンスを比較するべきだと思います。そうしないと、フォーム生成はオプションの項目のリストから現在の値を見つけることができません。

これは、BuilderType に実装されているときに equals の呼び出しを確認することで確認できます。

私は同じ問題に直面していましたが、 Spring Data bookのこのコメントとサンプル コード (AbstractEntity.java) の助けを借りて解決できました。

于 2013-01-24T13:45:53.903 に答える