我使用spring 3.1和hibernate validator 4.2。我观察到,休眠验证被调用两次: 一个在控制器级别当我使用类似的方法:Hibernate bean验证问题
@RequestMapping(method = RequestMethod.POST)
public String onSubmit(@Valid User user, BindingResult result) {....}
而当实体持续为部分第2次:
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(..)
org.hibernate.action.EntityUpdateAction.preUpdate(..)
我相信,这使更有意义在控制器级别有效并显示带错误消息的错误页面。无论如何,在流程中做两次相同的验证并不好。 我发现在休眠文档中可以通过在休眠配置中将hibernate.validator.autoregister_listeners
设置为false来关闭它,但不建议这样做。
那么什么是验证的推荐方法?同样在我的特殊情况下,第二次验证会导致麻烦,因为我有一个字段'confirmPassword
',这是用户提交表单时所需的验证字段,但在表格中并不需要,所以无论何时我必须保存,更新用户,我必须不必要地设置confirmPassword
字段通过验证。
因此,你建议我应该有两个pojo bean一个用户窗体进行视图验证和其他用户保存到数据库。而且我在两者上都有验证注释。其中很常见的例子是,一个单独的bean既用于jsp form也用于保存到数据库,从而节省了用于将字段从一个bean复制到另一个的代码。这是一种不好的做法吗? – user1694519
..根据我的经验,并非(总是)有可能为视图和数据库创建一个类,考虑到在视图中并不罕见的是来自许多持久实体的当前字段(我称之为域视图上的'视图' ),而且(和你的情况一样,confirmPassword)有些字段没有持久性。在我的例子中,有一个bean(userForm)持有持久化类bean(有时候指的是更持久的bean):在我的例子中,confirmPassword/confirmEmail位于'表单bean'中,并且字段密码/电子邮件位于“实体”(永久性bean)中。 – obe6
嗯,是的,你说的话对于使用两类物品VO和DTO来说是非常有意义的。我觉得代码中会有很多语句,如'user.setEmail(userForm.getEmail())',这看起来不太好。据我记得,即使春天roo生成代码使用相同的类视图和分贝。 – user1694519