2017-08-17 110 views
0

编辑:错误存在于6.0.1.Final但不5.4.1.Final。提交错误报告:尝试使用validateValue方法与值提取休眠validateValue相互作用

/** 
* Validates all constraints placed on the property named {@code propertyName} 
* of the class {@code beanType} would the property value be {@code value}. 
* <p> 
* {@link ConstraintViolation} objects return {@code null} for 
* {@link ConstraintViolation#getRootBean()} and 
* {@link ConstraintViolation#getLeafBean()}. 
* 
* @param beanType the bean type 
* @param propertyName property to validate 
* @param value property value to validate 
* @param groups the group or list of groups targeted for validation (defaults to 
*  {@link Default}). 
* @param <T> the type of the object to validate 
* @return constraint violations or an empty set if none 
* @throws IllegalArgumentException if {@code beanType} is {@code null}, 
*   if {@code propertyName} is {@code null}, empty or not a valid object property 
*   or if {@code null} is passed to the varargs groups 
* @throws ValidationException if a non recoverable error happens 
*   during the validation process 
*/ 
<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, 
               String propertyName, 
               Object value, 
               Class<?>... groups); 

问题包含包裹属性的bean,在这种情况下的JavaFX的ObjectProperty<BigInteger>出现时https://hibernate.atlassian.net/browse/HV-1471

Hibernate的验证是抛出一个错误。验证被放置在字段在模型和类验证与展开的属性正确地执行。

@NotNull 
@Min(value = MINIMUM_ACCEPTABLE_PORT) 
@Max(value = MAXIMUM_ACCEPTABLE_PORT) 
private ObjectProperty<BigInteger> multicastListenPort = new SimpleObjectProperty<>(); 

public BigInteger getMulticastListenPort() { 
    return multicastListenPort.get(); 
} 

public ObjectProperty<BigInteger> multicastListenPortProperty() { 
    return multicastListenPort; 
} 

public void setMulticastListenPort(BigInteger multicastListenPort) { 
    this.multicastListenPort.set(multicastListenPort); 
} 

验证的Util类:

public static <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, 
     Class<?>... groups) { 

    Validator validator = getValidator(); 

    return validator.validateValue(beanType, propertyName, value); 
} 

private static Validator getValidator() { 
    return Validation.byDefaultProvider() 
      .configure() 
      .messageInterpolator(
        new ResourceBundleMessageInterpolator(
          new PlatformResourceBundleLocator("messages"))) 
      .buildValidatorFactory() 
      .getValidator(); 
} 

当使用validateValue,休眠尝试所提供的值转换为包装类,而不是所包含的类,引起类转换异常。 java.math.BigInteger cannot be cast to javafx.beans.value.ObservableValue。如果提供的值被包裹在一个SimpleObjectProperty,它试图投前被解开。

例呼叫

Set<ConstraintViolation<Settings>> violations = ValidationHelper.validateValue(
     Settings.class, "multicastListenPort", updatedValue); 

随着updatedValue包裹在SimpleObjectProperty(相同栈跟踪,被解开,然后再次尝试解开)

Set<ConstraintViolation<Settings>> violations = ValidationHelper.validateValue(
     Settings.class, "multicastListenPort", new SimpleObjectProperty<>(updatedValue)); 

堆栈跟踪

javax.validation.ValidationException: HV000221: An error occurred while extracting values in value extractor org.hibernate.validator.internal.engine.valueextraction.ObservableValueValueExtractor. 
at org.hibernate.validator.internal.engine.valueextraction.ValueExtractorHelper.extractValues(ValueExtractorHelper.java:47) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:104) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:552) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:510) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:479) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:444) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateValueInContext(ValidatorImpl.java:798) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateValue(ValidatorImpl.java:224) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 


Caused by: java.lang.ClassCastException: java.math.BigInteger cannot be cast to javafx.beans.value.ObservableValue 
at org.hibernate.validator.internal.engine.valueextraction.ObservableValueValueExtractor.extractValues(ObservableValueValueExtractor.java:20) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 
at org.hibernate.validator.internal.engine.valueextraction.ValueExtractorHelper.extractValues(ValueExtractorHelper.java:41) ~[hibernate-validator-6.0.1.Final.jar:6.0.1.Final] 

回答