私はSpring MVCとSpring Dataを使用しており、Spring Dataを構成DomainClassConverter
して、文字列IDを適切なドメインクラスに自動的に変換します。
私は今、次を使用してタグを使用して Order to Customer 参照を実装しています。
<form:select path="customer">
<form:option value="" label="Select" />
<form:options items="${customers}" itemValue="id" />
</form:select>
これにより、指定された HTML が生成されます。
<select id="customer" name="customer" class="span6">
<option value="">Select</option>
<option value="1">Customer A</option>
<option value="2">Customer B</option>
<option value="3">Customer C</option>
</select>
たとえば顧客 A を選択して投稿を送信すると、次のような例外が発生します。
org.apache.jasper.JasperException: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull @javax.persistence.ManyToOne nl.kapsalonreflection.domain.Customer for value ''; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!
受け取る値は '' ではなく 1 である必要があるため、これはまったく意味がありません。受信したリクエスト パラメータもデバッグしましたが、customer=1 しか含まれていませんでした (予想どおり)。
InvalidDataAccessApiUsageException
は Spring Data から来ていることに注意してくださいDomainClassConverter
。このコンバーターを削除すると、問題は発生しなくなります。
DomainClassConverter
私はまた、それが2回カバーしようとしているのを見ることができるものをデバッグしました。最初は文字列値 1 (予想どおり) でしたが、次に空の文字列で別の呼び出しを行ったため、例外が発生しました。
それはもっと奇妙になりますが...
<form:option value="" label="Select" />
プレーンな html 要素に置き換えると<option value="">Select</option>
、例外は発生しないため、文字列 1 を使用して convert メソッドが呼び出されるのは 1 回だけです。奇妙な点は、両方が同じ html 出力<form:option value="" label="Select" />
を生成することです...<option value="">Select</option>
動作を説明できません...プレーンなhtml要素を使用した「回避策」があるようですが、問題の原因を知りたいです。