ich eine benutzerdefinierte Validierung mit Anmerkungen haben, wie:manuell mit einem benutzerdefinierten Validator ohne Standardkonstruktors validieren
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniquePropertyValidator.class)
public @interface UniqueProperty {
String message() default "sample message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
hier ist mein Validator:
public class UniquePropertyValidator extends JdbcDaoSupport implements ConstraintValidator<UniqueProperty, UniquePropertyClass> {
@Inject public UniquePropertyValidator(DataSource dataSource) {
setDataSource(dataSource);
}
@Override
public void initialize(UniqueProperty property) {
}
@Override
public boolean isValid(UniquePropertyClass propertyClass, ConstraintValidatorContext constraintValidatorContext) { return some boolean; }
}
und ich versuche, es wie folgt zu verwenden:
SpringValidatorAdapter adapter = new SpringValidatorAdapter(validator);
BeanPropertyBindingResult result = new BeanPropertyBindingResult(propertyClass, propertyClass.getClass().getName());
adapter.validate(propertyClass, result, UniquePropertyClass.SomeValidationGroup.class);
if (result.hasErrors())
throw new MethodArgumentNotValidException(null, result);
aber ich bin immer diese Fehlermeldung:
HV000064: Unable to instantiate ConstraintValidator: class some.package.UniquePropertyValidator.
Nun bin ich mir bewusst, dass meine Validator-Klasse keinen Standardkonstruktor ohne Methodenparameter haben. Folgendes funktioniert jedoch mit der genauen Annotation und dem Validator:
public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)
Was ich fragen ist; Gibt es eine Möglichkeit, ohne den Standardkonstruktor manuell zu validieren.
P.S. Der Grund, warum ich nicht @Validated
(das Arbeits Beispiel oben) verwenden können, ist:
Ich habe ein @PathVariable
(sagen wir id
) und vor @RequestBody UniquePropertyClass propertyClass
Objekt Validierung, muss ich vor der id
von UniquePropertyClass
Objekts einzustellen es Validierung, da konnte ich nicht finden Sie einen Weg, um das @PathVariable
in @RequestBody
Feld zu binden und im laufenden Betrieb mit @Validated
zu validieren. Es wäre also eine vollkommen akzeptable Antwort, einen Hinweis darauf zu geben, wie dies funktioniert.
Danke!
nicht immer Frühling eine neue Instanz erstellen mit 'adapter.validate (Propertyclass, Ergebnis, UniquePropertyClass.SomeValidationGroup.class); 'anstatt den im Anwendungskontext vorhandenen zu verwenden, wenn ich' @ Component' verwende? Oder wird es nur ein neues erstellen, da es im Anwendungskontext keinen finden konnte? –
Es wurde das im Anwendungskontext verwendete verwendet, anstatt ein neues zu erstellen. Vielen Dank! –
Sorry, mein schlecht, vergessen zu 'clean' und' install' Es versuchte, einen neuen zu erstellen, anstatt den einen zu verwenden, die im Anwendungskontext ist, und der 'dataSource' war null, da das neu erstellte man nicht verwaltet von Frühling. Vielleicht kann ich '@ Configurable' verwenden? –