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