2016-12-26 3 views
0

Я пытаюсь создать проверку пользовательских боба, поэтому я пишу это пользовательское ограничение:Hibernate Ошибка с пользовательским Bean Validation

@Documented 
@Constraint(validatedBy = ValidPackageSizeValidator.class) 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ValidPackageSize { 

    String message() default "{br.com.barracuda.constraints.ValidPackageSize}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 

} 

И валидатор:

public class ValidPackageSizeValidator implements ConstraintValidator<ValidPackageSize, PackageSize> { 

... 

    @Override 
    public boolean isValid(PackageSize value, ConstraintValidatorContext context) { 
    ...validation login here.. 
    } 

} 

Кроме того, я хотел валидация, выполняемая на сервисном уровне сразу после того, как вызываются некоторые декораторы, поэтому я создал другой декоратор для обработки этой задачи.

@Decorator 
public abstract class ConstraintsViolationHandlerDecorator<T extends AbstractBaseEntity> implements CrudService<T> { 

    @Any 
    @Inject 
    @Delegate 
    CrudService<T> delegate; 

    @Inject 
    Validator validator; 

    @Override 
    @Transactional 
    public T save(T entity) { 
     triggerValidations(entity); 
     return delegate.save(entity); 
    } 

    private void triggerValidations(T entity) { 
     List<String> errorMessages = validator.validate(entity).stream() 
      .map(ConstraintViolation::getMessage) 
      .collect(Collectors.toList()); 
     if (!errorMessages.isEmpty()) { 
     throw new AppConstraintViolationException(errorMessages); 
     } 
    } 
} 

Все работает, но если валидация проходит, спящий режим выдает ошибку:

ERROR [default task-6] (AssertionFailure.java:50) - HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in br.com.barracuda.model.entities.impl.PackageSize entry (don't flush the Session after an exception occurs) 

Мои объекты используют автоматически генерируемые id значения.

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
protected Long id; 

Использование Widlfly 9 с JEE 7.

ответ

0

Проверка была выполняется дважды, один раз в уровне услуг (где я хотел, чтобы это произошло), и один раз, когда объект был сохранялись/объединенным (JPA звала его). Поэтому я отключил его, добавив следующую строку в моей persistence.xml:

<property name="javax.persistence.validation.mode" value="none"/>

Теперь все работает отлично