2016-07-01 17 views
1

ich mehrere gemeinsame Anmerkungen auf einmal mit einer benutzerdefinierten Validierung Anmerkung wie diese anzuwenden bin versucht:Dropwizard benutzerdefinierte Validierung Annotation nicht funktioniert

@Retention(RetentionPolicy.RUNTIME) 
@Length(max=25, min=1, message="invalid length") 
@NotNull 
@Pattern(regexp = "[a-zA-Z0-9]{1, 25})") 
public @interface MyAnnotation { 
} 

und dessen Verwendung in meinem Modellklassen wie folgt aus:

@MyAnnotation 
public String firstName; 

Keine dieser Überprüfungen funktioniert, aber sie funktionieren wie erwartet, wenn sie in der Modellklasse selbst verwendet werden. Ich habe auch versucht, MyAnnotation in der Run-Methode der Anwendung zu registrieren, und das hat auch nicht funktioniert.

environment.jersey().register(MyAnnotation.class);

Was muss ich tun, um benutzerdefinierte Validierungen zu benutzen?

+0

dies hier Beantwortet: http://stackoverflow.com/questions/37837497/how-do-i-use-a-custom-validator- with-dropwizard/37863750 # 37863750 – pandaadb

Antwort

0

Entweder mit Anmerkungen versehen, die String direkt:

@Pattern(regexp = "[a-zA-Z0-9]{1, 25})") 
@NotNull 
@Length(max=25, min=1, message="invalid length") 
public String firstName; 

Oder eine Prüfers erstellen, so etwas wie:

class MyAnnotatationValidator implements ConstraintValidator<MyAnnotation, String>{ 
    @Override 
    public void initialize(MyAnnotation a){} 
    @Override 
    public boolean isValid(String s, ConstraintValidationContext c) { 
    return s != null && (s.length() > 0 && s.length() < 26) && s.matches("[a-zA-Z0-9]{1, 25})"; 
    } 
} 

Und haben

@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy=MyAnnotatationValidator.class) 
public @interface MyAnnotation { 
    String message() default = "{MyAnnotation}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload> payload() deafult {}; 
} 
0

Nach dem JSR-303

Eine Constraint-Definition kann Attribute enthalten, die zum Zeitpunkt der Anwendung der Constraint auf eine JavaBean angegeben werden. Die Eigenschaften werden als Anmerkungselemente zugeordnet. Die Annotationselementnamen Nachricht, Gruppen und Nutzdaten werden als reservierte Namen betrachtet. Anmerkungselemente, die mit "gültig" beginnen, sind nicht zulässig. Eine Einschränkung kann einen beliebigen anderen Elementnamen für ihre Attribute verwenden.

Sie müssen also Nachrichten, Gruppen und Nutzlastattribute zu Ihrem @MyAnnotation hinzufügen.
Zusammensetzung von Anmerkungen versehen, die zusammengesetzte Einschränkung Beispiel getan wird:

@Length(max=25, min=1, message="invalid length") 
@NotNull 
@Pattern(regexp = "[a-zA-Z0-9]{1, 25})") 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER}) 
@Retention(RUNTIME) 
public @interface MyAnnotation { 
    String message() default "My annotation message"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 
+0

Dies funktioniert nicht, die Validierungen werden aus irgendeinem Grund nicht angewendet. – user5451656

+0

Können Sie weitere Details zu Ihrem Code teilen? Versuchen Sie, einen POST-Körper zu validieren wie: @POST public void validPost (@Valid MyBean mybean) {} Oder in einer JPA-Ebene? –