0

我有一个会话属性,myForm 包含一些从数据库加载的 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=]

如果我在 objectToValidate 上运行 gettter,//TEST CODE HERE如下所示,我得到传入的正确值(例如“dummy”),如果在运行后我再次观察到“objectToValidate”,它会显示与上面相同的结果,即使它现在应该是 no更长的延迟初始化。

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

如果我在 处创建一个虚拟对象//TEST CODE HERE,则代码可以正常工作,并且活页夹会发现错误。

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

基本上 binder.getBindingResult() 在使用休眠对象时不会,我不知道如何修复它。似乎它无法解析 LAZY 初始化的休眠对象属性(即使在我调用对象上的方法并获得正确结果之后)。

4

1 回答 1

0

如果您使用延迟初始化,那么休眠必须使用代理。这意味着它objectToValidate不是“真正的”对象,它只是表现得像它。

在您的情况下,验证发生在字段级别。毕竟你已经注释了字段email而不是属性getEmail()

虽然我不能说你的情况到底发生了什么,但我可以说这与访问代理和直接访问字段之间的差异有关。我建议要么注释属性,要么不使用延迟初始化。

于 2013-06-27T13:39:52.673 回答