Ich habe einen REST-Service mit Spring Boot erstellt. An einem der Endpunkte habe ich ein Datum gepostet, zusammen mit 2 anderen Parametern. Nach dem Buchen werden die Anfrageparameter an ein Objekt gebunden. Das Datum wird an ein Feld LocalDate
gebunden. Nach der Buchung, aber vor der Bindung, möchte ich die Request-Parameter mit Validierung und Hibernate Validator validieren. Es gibt keine verfügbare Validierung für LocalDate
und ich muss daher eine benutzerdefinierte Validierung für LocalDate
schreiben.Überprüfung des REST-Endpunktparameters gegenüber LocalDate mit benutzerdefinierter Validierung
Dies ist, was an den Endpunkt geschrieben wird:
/parameter-dates?parameterDateUnadjusted=2017-02-29&limit=5&direction=d
Hier ist der Code für den Endpunkt:
@GetMapping(value = "/parameter-dates")
public ResponseEntity getParameterDates(@Valid ParameterDateRequest parameterDateRequest, Errors errors) {
// DO SOME STUFF
}
Hier wird das Modell für das Objekt verwendet:
@Component
@Data
public class ParameterDateRequest {
@MyDateFormatCheck(pattern = "yyyy-MM-dd", message = "Date not matching")
LocalDate parameterDateUnadjusted;
@NotEmpty(message = "Direction can't be empty")
String direction;
@Digits(integer=1, fraction=0, message = "Limit has to be an integer of max 100 000")
int limit;
}
Dies ist der Code für die Validierungsannotation:
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = MyDateFormatCheckValidator.class)
@Documented
public @interface MyDateFormatCheck {
String pattern();
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Dies ist der Code für die Selbstvalidierung es:
public class MyDateFormatCheckValidator implements ConstraintValidator<MyDateFormatCheck, LocalDate> {
private MyDateFormatCheck check;
@Override
public void initialize(MyDateFormatCheck constraintAnnotation) {
this.check = constraintAnnotation;
}
@Override
public boolean isValid(LocalDate object, ConstraintValidatorContext constraintContext) {
if (object == null) {
return true;
}
return isValidDate(object, check.pattern());
}
public static boolean isValidDate(LocalDate inDate, String format) {
// TEST IF inDate IS VALID RETURN TRUE/FALSE
}
}
Ist dies der falsche Ansatz? Ich denke, die ist eigentlich eine String
anstatt eine LocalDate
, wenn es auf den Endpunkt gebucht wird und dann mein Validator sollte eine String
als inDate
verwenden, aber dann muss ich mein Modell für parameterDateUnadjusted
zu String, die nicht für das Programm funktioniert ändern wie es es als LocalDate
verwendet. Ich bin mir nicht sicher, was ich hier machen soll. Irgendwelche Vorschläge?