我有两个@Entity bean。 Bean one是第二个“一对多”。 Bean1和Bean2具有JSR303不同的注释验证器。
@Entity
class Bean1 {
@OneToMany
private List<Bean2> var;
//other fields marked with JSR303
}
@Entity
class Bean2 {
//other fields marked with JSR303
}
我的任务是验证内部Bean2。 首先,我有控制器与@Validated of Bean1
@Controller
class Controller {
public String methodPOST(@Validated Bean1 bean1, BindingResult errors)
}
在尝试持久化到DB之前,Hibernate会自动验证JSR303。所以,我甚至没有Bean2的任何验证异常,因为Spring不处理它们,而Hibernate抛出它。
我可以创建类似DTO bean的东西,并验证它们,如果将它标记为@Valid,将验证内部Bean2DTO,并且不会从Hibernate端抛出任何异常,因为在持久性之前没有验证。同样在这种情况下,我将在Controller方法中填充BindingResult。
是否有一些解决方案可以将Hibernate org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)中的javax.validation.ConstraintViolationException抛出到我的BindingResult中,而没有上面两个选项。
另外,我无法在持久化之前禁用Hibernate自动验证,因为其他数量的逻辑损坏。
谢谢。
答案 0 :(得分:3)
可以找到可能重复的here
总结一下,您需要使用@Valid
注释您的嵌套属性@Entity
class Bean1 {
@OneToMany
@Valid
private List<Bean2> var;
//other fields marked with JSR303
}
@Entity
class Bean2 {
//other fields marked with JSR303
}
那也应该在Spring中触发嵌套验证(假设它也配置了JSR-303验证器)。