1

私のSpringMVCプロジェクトには、Class1の更新ページがあり、Class1のエンティティのコレクションにバインドされているform:checkboxタグのリストを表示する必要があります。

Class1.java:

class Class1 {
  private Set<Class2> set;
  //... other fields 
}

updateclass1.jspxの場合:

<c:forEach items="${allClass2Instances}" var="class2">
   <form:checkbox label="${class2.name}" path="set" value="${class2}"/><br/>
</c:forEach>

上記のチェックボックスタグを使用して、ページを表示すると、Class2インスタンスがclass1のSetの一部である場合はチェックボックスがオンになり、そうでない場合はチェックボックスがオフになります。しかし、送信を押すと、次のエラーが発生します。

Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Set' for property 'set'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "Name 1" from type 'java.lang.String' to type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "Name1"

ページにデータが入力されたときにわかる限り、form:checkboxタグには、正しいチェック済み/チェックなしの値を設定するためのインスタンスが必要ですが、送信時に、JSPはclass2.toString()値の配列を期待するコンバーターに送信します。 ID。逆に、タグを次のように変更すると、次のようになります。

<form:checkbox label="${class2.name}" path="set" value="${class2.id}"/><br/>

バインディングは正常に機能しますが、更新ページを表示すると、渡された値がオブジェクトIDであることをタグが認識しないため、チェックボックスが正しくオン/オフになりません。

チェックボックスタグが期待するものと一致する送信後のバインディングを作成するにはどうすればよいですか?

重要な場合、これはすべてRooによって生成されたスキャフォールディングページ内にあります。

4

1 に答える 1

0

今のところ、これを機能させる方法を考え出しました。誰かがより良い解決策を思いついた場合は、それを追加してください。代わりに正しいとマークします。

上記の問題は、さまざまな場所でさまざまなものを評価するために${InstanceOfClass2}が必要なために発生していました。

  1. タグの評価時に、<form:checkbox>Class2の実際のインスタンスに評価される式が必要でした
  2. タグが完了した後、生成されたタグのvalue属性は、<input type="checkbox">Class2のインスタンスの数値IDフィールドと等しくなる必要があります。

解決策は、Class1Controllerにコンバーターを追加することでした。例:

Converter<Class2, String> getClass2Converter() {
    return new Converter<Class2, String>() {
        public String convert(Class2 instance) {
            return "" + instance.getId();
        }
    };
}

したがって、式$ {InstanceOfClass2}はチェックボックスタグのClass2インスタンスに評価されますが、実際のHTMLの書き込みに関しては数値IDに変換されます。

Rooを使用する場合、このアプローチは非常に面倒です。Class1に関連する他のすべてのスキャフォールドは、この同じConverterを使用することを望んでいるため、Class2.nameまたは他のそのようなフィールドを表示したいIDがどこにでも表示されるようになりました。Spring Rooカスタムタグを変更することでこれを解決しました-存在する場合、コレクション全体を呼び出すのではなく、コレクションを繰り返して各要素を呼び出すことにより、タグがコレクションを評価するように強制<field:display>する属性を追加しました。呼び出されます。fmtCollectionToStringtoStringspring:eval

私が言うように、きちんとした解決策は大いに感謝します!たとえば、さまざまな状況でコンバーターの動作を変える方法がある場合でも、それを聞きたいと考えています。

于 2010-11-18T16:08:17.977 に答える