【问题标题】:JPA: merge and persist,catch ConstraintViolationExceptionJPA:合并和持久化,捕获 ConstraintViolationException
【发布时间】:2014-04-27 15:17:24
【问题描述】:

您好,我怀疑如何在合并期间捕获 ConstraintViolationException。我有我的 JPALogic 类,我想捕获异常以写下更多信息,这段代码完美运行,抛出 GenericSaveException:

try {
  em.persist(o);
} catch (ConstraintViolationException e) {
  System.out.println("*** CONSTRAINT VIOLATIONS");
  Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
  for (ConstraintViolation<?> violation : violations) {
    System.err.println("*** VIOLATION: " + violation.getRootBeanClass().getSimpleName() + "::" + violation.getPropertyPath().toString() + " " + violation.getMessage());
  }
  throw new GenericSaveException();
}

但这不会抛出异常,导致 javax.ejb.EJBException:事务中止,原因:javax.transaction.RollbackException:标记为回滚的事务,原因:javax.validation.ConstraintViolationException:

try {
  managed = (T) em.merge(o);
} catch (ConstraintViolationException e) {
  System.out.println("*** JPALogic::merge --> CONSTRAINT VIOLATIONS");
  Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
  for (ConstraintViolation<?> violation : violations) {
    System.err.println("*** VIOLATION: " + violation.getRootBeanClass().getSimpleName() + "::" + violation.getPropertyPath().toString() + " " + violation.getMessage());
  }
  throw new GenericSaveException();
}

为什么合并不抛出 ConstraintViolationException?我该怎么做才能捕获异常?

谢谢。

【问题讨论】:

    标签: java exception jpa merge persistence


    【解决方案1】:

    可能为时已晚,但我也面临同样的问题。

    实际上这在某种程度上是在 Hibernate 的实现中,请参阅:https://issues.jboss.org/browse/AS7-4576,而https://hibernate.atlassian.net/browse/HHH-7288 表示它不会修复。可能这个功能(第一次调用时验证)可以在 EclipseLink 上运行,但我还没有尝试过。

    为了解决这个问题,我使用了一些更改的逻辑,在我的服务层中,在调用合并或持久化之前,我运行以下命令:

    Set<ConstraintViolation<Contact>> validations = validator.validate(data);
    if (validations.size() > 0) {
        Map<String, String> messages = new HashMap<>();
        for (ConstraintViolation v : validations) {
            messages.put(v.getPropertyPath().toString(), v.getMessage());
        }
    
        return Response.status(Response.Status.BAD_REQUEST).entity(messages).build();
    }
    

    验证器在我的 bean 中是简单的注入:

    @Inject
    Validator validator;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 2013-08-24
      • 2011-05-21
      • 2016-05-14
      • 2021-08-23
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多