【问题标题】:JPA2 data validation verbose loggingJPA2 数据验证详细日志记录
【发布时间】:2013-09-13 12:05:58
【问题描述】:

我在独立的 Java 应用程序中使用 EclipseLink 2.5 和 JPA 2.1。

某些字段标有@Basic(optional=false),但即使是空值,我在提交之前也没有收到任何错误。约束是在数据库上设置的,所以我得到了一个 JDBC 异常。

将 Hibernate Validator 添加到项目并将验证模式设置为回调没有帮助。

只有在字段上使用@NotNull 注释时,我才得到异常:javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details. 这不是很具体,也不会告知问题出在哪里。

我想知道是否有任何方法可以使此消息看起来更可靠:例如未设置字段名称或类似的内容,并强制 eclipselink 检查 optional=false。

编辑: 我知道 JPA 和 Bean Validation 之间的区别。我正在尝试仅使用 JPA 执行验证,使用 optional=false。据我所知 (@Basic(optional = false) vs @Column(nullable = false) in JPA) @Basic(optional=false) 应在运行时检查,@Column(nullable=false) 应用于使数据库中的列不可为空。

我正在寻找一种方法来显示违规行为,而不会到处捕获 ConstraintViolations。

【问题讨论】:

    标签: java jpa-2.0 eclipselink hibernate-validator


    【解决方案1】:

    这里有几件事。首先你必须区分 JPA 和 Bean Validation。两种不同的规格和东西。 @Basic 是 JPA 注释,而 @NotNull 是 Bean Validation 注释。将@Basic(optional=false) 与模式创建结合使用,您确实会得到一个数据库约束,这反过来又会在持久化期间导致 JDBC 异常。

    通过引入 Bean Validation,您可以激活 Bean Validation 的 JPA 集成。在这种情况下,在写入数据库之前,数据将通过 Bean Validation 进行验证。在这种情况下,作为 pre-persist 的一部分。根据规范,在这种情况下会引发 ConstraintViolationException。您可以调用 ConstraintViolationException.getConstraintViolations 来获取一组失败的约束。由您自己来捕获此异常并进行解包。

    【讨论】:

    • 我知道 JPA 和 Bean Validation 的区别。我正在尝试仅使用 JPA 执行验证,使用 optional=false。
    【解决方案2】:

    我正在寻找一种方法来显示违规行为,而不会到处捕获 ConstraintViolations。

    您可以在应用程序代码的最外层添加一个catch(ConstraintViolationException cve) {...} 块(例如,以某种请求处理程序/拦截器的形式,以防这是一个 Web 应用程序)并使用它以通用方式处理约束违规。 ConstraintViolation 对象提供了大量信息,例如相关属性的名称等。不过,我不确定为什么 EclipseLink 不考虑 @Basic(optional=false)

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2017-03-13
      • 1970-01-01
      • 2022-11-15
      • 2012-10-08
      • 2013-03-12
      • 1970-01-01
      • 2020-08-02
      • 2018-10-28
      相关资源
      最近更新 更多