无法在 http 会话中的休眠对象上使用 DataBinder
Posted
技术标签:
【中文标题】无法在 http 会话中的休眠对象上使用 DataBinder【英文标题】:Cannot use DataBinder on a hibernate object in the http session 【发布时间】:2013-06-27 03:45:35 【问题描述】:我有一个会话属性,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=]
如果我在 //TEST CODE HERE
的 objectToValidate 上运行 gettter,如下所示,我得到传入的正确值(例如“dummy”),如果在运行后我再次观察到“objectToValidate”,它甚至显示与上面相同的结果虽然它现在应该不再是 Lazy 初始化了。
String email = (Contact)objectToValidate.getEmail();
如果我在 //TEST CODE HERE
创建一个虚拟对象,代码可以正常工作,并且活页夹会发现错误。
Contact dummy = new Contact();
dummy.setEmail("dummy");
基本上 binder.getBindingResult() 在使用休眠对象时不会,我不知道如何修复它。它似乎无法解析 LAZY 初始化的休眠对象属性(即使在我调用对象上的方法并获得正确结果之后)。
【问题讨论】:
【参考方案1】:如果你使用延迟初始化,那么休眠必须使用代理。这意味着objectToValidate
不是“真实”对象,它只是表现得像它。
在您的情况下,验证发生在字段级别。毕竟你已经注释了字段email
而不是属性getEmail()
。
虽然我不能说你的情况到底发生了什么,但我可以说这与访问代理和直接访问字段之间的差异有关。我建议要么注释属性,要么不使用延迟初始化。
【讨论】:
以上是关于无法在 http 会话中的休眠对象上使用 DataBinder的主要内容,如果未能解决你的问题,请参考以下文章