如何在持久化之前使用Hibernate验证的内部@Entity类处理Spring BindingResult异常

时间:2013-08-20 08:49:17

标签: spring hibernate bean-validation spring-validator

我有两个@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自动验证,因为其他数量的逻辑损坏。

谢谢。

1 个答案:

答案 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验证器)。