So erhalten Sie ConstraintValidatorContext?
Ich Schreibe code, der der explizite Aufruf von Bean-Validation (JSR-303) so etwas wie dieses:
public class Example {
@DecimalMin(value = "0")
private static final String ANNOTATED = "";
public void isPossitiveNumber(String str){
ValidatorFactory factory =
Validation.buildDefaultValidatorFactory();
ConstraintValidator<DecimalMin, String>
validator =
factory.getConstraintValidatorFactory().getInstance(
DecimalMinValidatorForString.class);
validator.initialize(
ReflectionUtils.findField(getClass(), "ANNOTATED")
.getAnnotation(
DecimalMin.class));
boolean isValid = validator.isValid(str, null);
return isValid;
}
}
Beachten Sie die Zeile boolean isValid = validator.isValid(str, null);
Ich null
für ConstraintValidatorContext
weil ich keine Möglichkeit gefunden, zu erhalten/bauen es. In diesem speziellen Fall, wenn diese in Ordnung, weil es keine Nutzung der ConstraintValidatorContext
intern, aber es ist offensichtlich ein hack. Wie sollte ich ConstraintValidatorContext
?
HINZUGEFÜGT
Wurde ich gebeten, use-cases. So, zum Beispiel, ich bin writting benutzerdefinierte validator-und ich möchte, um die Wiederverwendung von vorhandenen Validierungen. Oder ich bin writting Flugzeug Java-code als desribed oben und ich will die Wiederverwendung von vorhandenen Validierung.
- Könntest du ein paar details zu Ihrem Anwendungsfall? Sie als Benutzer normalerweise die Interaktion mit der Bean Validierung über die
javax.validation.Validator
API, nicht durch das erstellen und aufrufen von constraint-Prüfungen mit der hand.ConstraintValidatorContext
übergeben wird, indem der Motor zu Prüfungen während der Validierung, so dass Ihre Umsetzung ist in der Regel nicht für die Benutzer verfügbar gemacht. - Zum Beispiel, ich bin writting benutzerdefinierte validator-und ich möchte, um die Wiederverwendung von vorhandenen Validierungen. Oder ich bin writting Flugzeug Java-code als desribed oben und ich will die Wiederverwendung von vorhandenen Validierung. Ich will hinzufügen, diese Klarstellung zu meinem post.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die einfache Antwort, die Sie nicht können. ConstraintValidatorContext ist eine Schnittstelle und es gibt keine Bean-Validation-API, um eine Instanz wie diese. Sie konnte schreiben Sie Ihre eigene Implementierung, aber um es richtig umsetzt, müssten Sie zu re-implementieren, die eine Menge Funktionalität des Bean-Validation-provider. Schauen Sie zum Beispiel auf der Hibernate-Validator-konkrete Umsetzung - https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintValidatorContextImpl.java
Sagte, ich glaube, dein Versuch der Wiederverwendung ist falsch. Dies ist nicht der Einzug von Bean-Validation und Sie werden am Ende mit nicht tragbar und schwer zu pflegen-code. Wenn Sie möchten, um die Wiederverwendung von bestehenden Einschränkungen haben Sie einen Blick auf constraint-Zusammensetzung, zum Beispiel @NotEmpty Wiederverwendung @NotNull und @Größe
Sollten Sie erklären, eine Gruppe für die Einschränkungen überprüfen Sie in diesem Fall. Dann können Sie die normale Prüfung für die Gruppe. Finden Sie in den Abschnitten 2.1.1.2 und Ziffer 3.4 ist die Skillung für die Gruppe-Definitionen und Ihre Semantik. Für die überprüfung der Gruppe, die du dann einfach aufrufen zu müssen
Validator.validate(T Object, Class<?>... groups)
. Es gibt keine Notwendigkeit, mess around mit denConstraintValidatorContext
in diesem Fall.ConstraintValidator
:This method can be accessed concurrently, thread-safety must be ensured by the implementation.
Und die Skillung auch StaatenCompliant implementations are allowed to cache ConstraintValidator instances retrieved from the ConstraintValidatorFactory.
(Abschnitt 2.4)Ich hatte vor kurzem genau das gleiche Problem wie der OP. Jedoch im Gegensatz zu den akzeptierte Antwort ist es möglich zu schreiben Unit-tests, die ConstraintValidationContext. Diese ausgezeichnete link erklärt, wie es zu tun, http://farenda.com/java/bean-validation-unit-testing/
Grundsätzlich müssen Sie die ValidatorFactory erhalten Sie eine Validator-Schnittstelle, dann rufen Sie validieren(c) auf die Schnittstelle, wobei der parameter c ist eine Instanz der Klasse, die das bean-validation-Annotationen. Ein code-Beispiel wird klarer, code-Beispiel entnommen aus dem oben genannten link.
}