私はSpringブートを使用してRESTサービスを構築しました。エンドポイントの1つでは、リクエストパラメータと他の2つのパラメータを一緒に送信しています。転記後、要求パラメータはオブジェクトにバインドされます。日付はLocalDate
フィールドにバインドされています。投稿後、バインディングの前に、私は検証とHibernate Validatorを使ってリクエストパラメータを検証するのが好きです。 LocalDate
の有効な検証はありません。そのため、LocalDate
のカスタム検証を書く必要があります。RESTエンドポイントパラメータの検証とカスタム検証によるLocalDateの比較
これは、エンドポイントに掲示する内容である:ここでは
/parameter-dates?parameterDateUnadjusted=2017-02-29&limit=5&direction=d
は、エンドポイントのコードです:ここで
@GetMapping(value = "/parameter-dates")
public ResponseEntity getParameterDates(@Valid ParameterDateRequest parameterDateRequest, Errors errors) {
// DO SOME STUFF
}
は、オブジェクトのために使用されるモデルである:
@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;
}
これは検証アノテーションのコードです:
@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 {};
}
これは、検証、それを自己のためのコード:これは間違ったアプローチ
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
}
}
ですか?プログラムは動作しません、それがエンドポイントに投稿されますとき、私はparameterDateUnadjusted
が実際にString
いうよりLocalDate
で推測し、その後、私のバリデータはinDate
としてString
を使用する必要がありますが、その後、私はStringにparameterDateUnadjusted
のための私のモデルを変更する必要がありますLocalDate
として使用しています。私は本当にここに何をするのか分からない。助言がありますか?