我在独立的Java应用程序中使用EclipseLink 2.5和JPA 2.1。
某些字段标有@Basic(可选= 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验证之间的区别。我试图仅使用JPA执行验证,使用optional = false。据我所知(@Basic(optional = false) vs @Column(nullable = false) in JPA)@Basic(optional = false)应该在运行时检查,并且@Column(nullable = false)应该用于在数据库中使列不可存在。
我正在寻找一种方法来显示违规行为,而不是到处捕捉ConstraintViolations。
答案 0 :(得分:1)
这里有几件事。首先,您必须区分JPA和Bean验证。两种不同的规格和东西。 @Basic是JPA注释,而@NotNull是Bean Validation注释。将@Basic(optional = false)与模式创建结合使用,您确实会获得数据库约束,这反过来会导致持久化期间出现JDBC异常。
通过引入Bean Validation,您可以激活Bean Validation的JPA集成。在这种情况下,在写入数据库之前,将通过Bean Validation验证数据。在这种情况下作为预先坚持的一部分。根据规范,在这种情况下抛出ConstraintViolationException。您可以调用ConstraintViolationException.getConstraintViolations来获取一组失败的约束。你应该抓住这个例外并自己解开。
答案 1 :(得分:0)
我正在寻找一种方法来显示违规行为,而不是到处捕捉ConstraintViolations。
您可以在应用程序代码的最外层添加catch(ConstraintViolationException cve) {...}
块(例如,以某个请求处理程序/拦截器的形式,如果这是一个Web应用程序),并使用它来以通用方式处理约束违规。 ConstraintViolation
对象提供了许多信息,例如相关属性的名称等。但我不确定EclipseLink为什么不考虑@Basic(optional=false)
。