0

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?

Antwort

0

Ich denke, was Sie suchen, ist - DateTimeFormat Annotation. Es hat keinen Sinn, das Datumsformat zu validieren, wenn der Wert bereits an LocalDate gebunden ist.

Verwandte Themen