2017-04-13 10 views
3

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!

Antwort

0

Erstellen eines Standard-Konstruktor für den UniquePropertyValidator und @Component Anmerkung hinzuzufügen. Dann fügen Sie einfach

@Inject 
private DataSource dataSource; 

hinzu, um die Datenquelle zu injizieren, anstatt sie von Constructor aus zu initialisieren. (Siehe mehr für autowiring objects in validator)

UPDATE Sie die Bohne aus dem Kontext erhalten können (siehe Spring get current ApplicationContext)

+0

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? –

+0

Es wurde das im Anwendungskontext verwendete verwendet, anstatt ein neues zu erstellen. Vielen Dank! –

+0

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? –

Verwandte Themen