2016-12-26 22 views
0

我試圖創建一個自定義Bean驗證,所以我寫這篇文章定製約束:Hibernate的錯誤使用自定義Bean驗證

@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"/>

現在一切工作正常