-1

Spring JSR303 検証を使用してオブジェクトを検証しようとしています。いくつかのフォーム プロパティとともにいくつかのネストされたオブジェクトを持つフォーム オブジェクトがあります。ここに私のフォーム署名があります

public class PaymentDetailsForm
{
  private AddressForm billingAddress;
  // other properties and getter and setters

}

私のAddressFormBean では、Bean 検証アノテーションを使用してデータを検証しましたが、 for@Valid内でアノテーションを使用していません。これは私の Controller メソッドの署名ですPaymentDetailsFormbillingAddress

public String createUpdatePaymentInfos(final Model model,
@ModelAttribute("paymentInfo") @Valid final PaymentDetailsForm form, final BindingResult bindingResult)
{
}

フォームから正しいデータを送信している場合、すべてが完全に正常に機能していますがbillingAddress、必須またはnullではないとしてマークされているフィールドを省略すると、次のバインディングエラー例外が発生します

org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'paymentInfo' on field 'billingAddress': 
rejected value [com.xxx.storefront.forms.AddressForm@e39f6f1,true]; 
codes [typeMismatch.paymentInfo.billingAddress,typeMismatch.billingAddress,typeMismatch.com.xxx.storefront.forms.AddressForm,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: 
codes [paymentInfo.billingAddress,billingAddress]; arguments []; default message [billingAddress]]; 
default message [Failed to convert property value of type 'java.lang.String[]' 
to required type 'com.xxx.storefront.forms.AddressForm' for property 'billingAddress';
nested exception is java.lang.IllegalStateException: 
Cannot convert value of type [java.lang.String[]] to required type [com.xxx.storefront.forms.AddressForm] for property 'billingAddress': 
no matching editors or conversion strategy found]

私は@validbillingAddressプロパティに注釈を使用していないため、検証されるべきではないことを期待していましたが、検証された場合でも、上記の例外/エラーを理解できません

4

2 に答える 2

0

これは、UI からのマッピングが間違っていたためでした。私の JSP ページでは、アドレス フィールドをbillingAddressオブジェクトにマッピングしていましたが、次のような隠しフィールドが 1 つあります。

<form:hidden path="billingAddress" id="billingAddress"/> 

String 配列を送信しようとしていて、Spring バインディングが何をしようとしているのかを区別できなかったため、これがエラーの原因でした

于 2012-12-13T19:46:35.927 に答える
0

表示されている bindingResult は、検証エラーが原因ではないように見えます。バインディング エラーが原因である可能性があります。UI フィールドを内部のbillingAddress フィールドにバインドできないためです。バインディング エラーでさえ、ご覧のようにすぐに続く bindingresult 引数に表示されることになります。

于 2012-12-13T19:04:13.530 に答える