2

我有两个 @Entity bean。豆一是第二个的“一对多”。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 的 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 中。

此外,我不能在持久性之前禁用休眠自动验证,因为其他逻辑量的损坏。

谢谢你。

4

1 回答 1

3

可能的重复可以在这里找到

回顾一下,您需要使用 @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 验证器)。

于 2013-08-20T14:14:57.357 回答