0

セッション属性があり、myForm には DB からロードされたいくつかの Hibernate オブジェクトが含まれています

@SessionAttributes("myForm")

コントローラーからフォームを受け取り、次のように処理します

@RequestMapping(value = "/mymapping", method = RequestMethod.POST)
@ResponseBody
public final JsonValidationResponse validateContact(
        @ModelAttribute(value = "myForm") final MyForm myForm) {

    return jsonValidator.getJsonErrors(myForm.getContact());

}

Contact クラスには、次の検証アノテーションがあります。

@Email
private String email;

次の方法に問題があります

    public final <T> JsonValidationResponse getJsonErrors(
            final T objectToValidate) {

        //TEST CODE HERE   

        DataBinder binder = new DataBinder(objectToValidate);
        binder.setValidator(validator);
        binder.validate();
        return getJsonErrors(binder.getBindingResult());
    }

objectToValidate を観察すると、次のように表示されます。これは、休止状態のオブジェクトであり、LAZY 初期化を使用しているためだと思います。

com.mypackage.Contact_$$_javassist_27@1bdbbc0[contactId=0,name=,email=,phone1=,phone2=,phone3=,version=0,createDate=,modifiedDate=,userId=]

//TEST CODE HERE以下のように objectToValidate でゲッターを実行すると、渡された正しい値 (「ダミー」など) が取得されます。より長いレイジー初期化。

String email = (Contact)objectToValidate.getEmail();

でダミー オブジェクトを作成する//TEST CODE HEREと、コードは正常に動作し、バインダーはエラーを検出します。

    Contact dummy = new Contact();
    dummy.setEmail("dummy");

基本的には、binder.getBindingResult() は hibernate オブジェクトを使用する場合には機能せず、修正方法がわかりません。LAZY 初期化された休止状態のオブジェクト プロパティを解決できないようです (オブジェクトのメソッドを呼び出して正しい結果を得た後でも)。

4

1 に答える 1

0

遅延初期化を使用している場合、休止状態はプロキシを使用する必要があります。つまり、それobjectToValidateは「実際の」オブジェクトではなく、そのように振る舞うだけです。

あなたの場合、検証はフィールドレベルで行われます。結局のところemail、プロパティではなくフィールドに注釈を付けましたgetEmail()

あなたのケースで正確に何が起こっているのかはわかりませんが、プロキシへのアクセスとフィールドへの直接アクセスとの間の不一致に関係していると言えます。プロパティに注釈を付けるか、遅延初期化を使用しないことをお勧めします。

于 2013-06-27T13:39:52.673 に答える