2017-08-17 1 views
0

EDIT: Bug ist in 6.0.1.Final vorhanden, aber nicht 5.4.1.Final. Übermittelt Bugreport: https://hibernate.atlassian.net/browse/HV-1471Hibernate validateValue Interaktion mit Wert Extraktor

Hibernate Validierung wirft einen Fehler, wenn versucht wird, die validateValue Methode zu verwenden

/** 
* 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); 

Das Problem stellt sich mit einer Bohne gewickelt Eigenschaften enthält, in diesem Fall JavaFX ist ObjectProperty<BigInteger>. Das Feld wird im Modell mit Validierungen versehen, und Klassenvalidierungen werden beim Auspacken der Eigenschaften korrekt ausgeführt.

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

Validator Util Klasse:

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

Wenn validateValue verwendet, Ruhezustand versucht, den angegebenen Wert auf die Hüllklasse anstelle der enthaltenen Klasse zu werfen, eine Klasse Guss Ausnahme verursacht. java.math.BigInteger cannot be cast to javafx.beans.value.ObservableValue. Wenn der bereitgestellte Wert in eine SimpleObjectProperty eingeschlossen wird, wird er vor dem Umwandeln ausgepackt.

Beispielaufruf

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

Mit updatedValue in einem SimpleObjectProperty gewickelten (gleichen Stack-Trace, ausgepackt wird und dann wieder versucht zu auszupacken)

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

Stapelüberwachung

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] 

Antwort