当前位置: 首页 > 知识库问答 >
问题:

如何处理内部@Entity类的Spring BindingResault异常,在持久性之前使用HiberNate验证

简俊楚
2023-03-14

我有两个@Entity豆。豆一是第二个的“一对多”。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。首先,我有控制器,带有@Val的Bean1

@Controller
class Controller {
    public String methodPOST(@Validated Bean1 bean1, BindingResult errors)
}

Hibernate在尝试持久化到DB之前会自动验证JSR303。所以,我甚至没有任何来自Bean2的验证异常,因为Spring不处理它们,Hibernate抛出它。

我可以创建类似DTO bean的东西,并验证它们,如果将内部Bean2DTO标记为@Valid,它将被验证,并且Hibernate端不会抛出异常,因为在持久化之前没有验证。同样,在这种情况下,我将在控制器方法中填充BindingResult。

是否有获得javax.validation的解决方案。ConstraintViolationException从Hibernate org.hhibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)抛出到我的BindingResult中,没有上述两个选项。

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

谢谢。

共有1个答案

洪和平
2023-03-14

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

概括地说,您需要用@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验证器)。

 类似资料:
  • 调用init方法失败;嵌套的异常是javax。坚持不懈PersistenceException:[PersistenceUnit:默认值]无法生成Hibernate SessionFactory 在更换系统中的操作系统后,我遇到了这个异常。在我的应用程序运行MySQL 5.7和java 8之前。现在我把它改成了mySQL 8和java 8。代码没有任何变化。原因一定是什么?? 下面是日志:

  • persistenceException:DB2 SQL错误:sqlcode=-206,sqlstate=42703,sqlerrmc=t0.id,driver=3.52.95{prepstmnt 1029586270

  • 我使用JPA和Hibernate作为容器管理事务的提供者(JBossAS 6.1.0.Final)。 我正在尝试实现一些细粒度的异常处理,因为我的应用程序上有一个特定的异常层次结构,所以我可以定义在任何情况下要做什么。因此,我已经研究了几个小时,发现文档很模糊,示例也有些原始,因为“为了清晰起见”总是忽略异常处理,或者是一个简单的try-catch块,用于处理异常e。 例如,采用以下代码: cat

  • 异常处理就是这样工作的吗?

  • 我一直在尝试使用JPA Hibernate和mysql整理与我的DB的连接,但出于某种原因,无论我尝试什么,在启动tomcat服务器时,我都会遇到相同的异常: 这是我的JPA配置类: } 在这一点上,我想不出还有什么可以尝试的。。任何帮助都是非常感激的 编辑:这是整个堆栈跟踪

  • 我错过了什么?我找不到任何处理这种异常的例子(例如,唯一的Contains)。