【问题标题】:Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event: 'prePersist'在回调事件上执行自动 Bean 验证时违反了 Bean 验证约束:“prePersist”
【发布时间】:2011-09-28 07:45:58
【问题描述】:

我在 Netbeans 7 中创建了一个 EJB Session 外观来保存我的实体。 我的 Insurance 和 RatePlan 类之间有一个多方映射。

public class Insurance{
    @ManyToOne(optional=false) 
    @JoinColumn(name="PLAN_ID")
    private RatePlan plan;
}
public class RatePlan{
    @OneToMany(mappedBy="plan")
    private Set<Insurance> insuranceItems;
}

当我尝试使用我的 EJB 会话 Bean 保存在我的数据库中时,我遇到了以下错误。

原因:javax.validation.ConstraintViolationException:在回调事件“prePersist”上执行自动 Bean 验证时违反了 Bean 验证约束。有关详细信息,请参阅嵌入式 ConstraintViolations。

我所做的是在我的 Persistence.xml 文件中关闭我的 Bean 验证。 我想知道发生了什么 Bean 验证错误,但我不知道如何或在哪里找到它或如何配置和捕获它。

我的 EJB 外观是一个像 tis 这样的简单类。

public class InsuranceFacade{
    public void saveInsurance(Insurance insurance){
        em.persist(insurance);
    }
}

有什么提示吗?

【问题讨论】:

  • 我很想知道当这些实体中没有特定于 bean 验证的注释时,它可能是什么违规行为!
  • 我实际上删除了所有的 bean 验证注释,以便代码更易于阅读... =)

标签: jpa jakarta-ee bean-validation


【解决方案1】:

我想知道发生了什么 Bean 验证错误,但我不知道如何或在哪里找到它或如何配置和捕获它。

要了解发生了哪些特定的约束违规,您只需检查捕获的异常即可。 ConstraintViolationException.getConstraintViolations() 返回一组 ConstraintViolations,您可以对其进行迭代和检查。

【讨论】:

  • 嗨,stratwine,你的意思是在我的 EJB 外观类和保存操作中,我会使用 try catch 块来检查这个异常吗?你能证实我的理解吗?谢谢
  • This thread,内嵌的博客文章显示了如何将 ConstraintVioldationException 作为 ApplicationException,从而在客户端中“按原样”获取它。在调用客户端有一个 catch 块对我来说看起来不错,检查违反了什么。
【解决方案2】:

我遇到了同样的问题,但经过数小时寻找答案后,我终于找到了....您应该编辑您的 AbstractFacade.java 类并添加这个代码

public void create(T entity) {

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
    if(constraintViolations.size() > 0){
        Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
        while(iterator.hasNext()){
            ConstraintViolation<T> cv = iterator.next();
            System.err.println(cv.getRootBeanClass().getName()+"."+cv.getPropertyPath() + " " +cv.getMessage());

            JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
        }
    }else{
        getEntityManager().persist(entity);
    }
}

现在,此方法将提醒您哪个属性以及验证失败的原因。 我希望这对你有用,就像对我一样。

【讨论】:

    【解决方案3】:
    catch (EJBException e) {
            @SuppressWarnings("ThrowableResultIgnored")
            Exception cause = e.getCausedByException();
            if (cause instanceof ConstraintViolationException) {
                @SuppressWarnings("ThrowableResultIgnored")
                ConstraintViolationException cve = (ConstraintViolationException) e.getCausedByException();
                for (Iterator<ConstraintViolation<?>> it = cve.getConstraintViolations().iterator(); it.hasNext();) {
                    ConstraintViolation<? extends Object> v = it.next();
                    System.err.println(v);
                    System.err.println("==>>"+v.getMessage());
                }
            }
            Assert.fail("ejb exception");
        }
    

    【讨论】:

      【解决方案4】:

      在持久化实体的位置捕获以下异常。在我的例子中,它在 EJB add 方法中。我在哪里em.persist()。然后检查服务器日志,您将看到哪个属性违反了约束。

      catch (ConstraintViolationException e) {
             log.log(Level.SEVERE,"Exception: ");
             e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2015-12-29
        相关资源
        最近更新 更多