Bean Ограничения проверки, нарушенные при выполнении Automatic Bean Проверка на событие обратного вызова: 'prePersist'

Я создал фасад сессии EJB в своем Netbeans 7 для сохранения моего объекта. У меня есть многотоновое сопоставление между моим классом страхования и 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: Bean Ограничения проверки, нарушенные при выполнении Automatic Bean Проверка на событие обратного вызова: 'prePersist'. Пожалуйста, обратитесь к встроенным ConstraintViolations за подробностями.

Я сделал, чтобы отключить мою проверку Bean в моем файле Persistence.xml. Я хотел бы знать, что произошло с ошибкой проверки Bean, но я не знаю, как и где ее найти или как ее настроить и поймать.

Мой EJB-фасад - это простой класс, такой как tis.

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

Любые подсказки?

Ответ 1

Я хотел бы знать, что произошло с ошибкой проверки Bean, но я не знаю, как и где ее найти или как ее настроить и поймать.

Чтобы узнать, что произошло с конкретными нарушениями ограничений, вы можете просто проверить исключение. ConstraintViolationException.getConstraintViolations() возвращает набор ConstraintViolation, который вы можете выполнять итерации и проверки.

Ответ 2

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");
    }

Ответ 3

У меня такая же проблема, но после долгих поисков ответа, наконец, я нашел... Вы должны отредактировать свой класс 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);
    }
}

Теперь этот метод предупредит вас о том, какое свойство и почему он не прошел проверку. Надеюсь, это сработает для вас, как и для меня.

Ответ 4

Поймать следующее исключение, в котором вы сохраняете объект. В моем случае это в методе добавления EJB. где я делаю em.persist(). Затем проверьте журнал сервера, вы увидите, какой атрибут имеет ограничение на нарушение.

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