Spring - проверять поле String в бобе, которое на самом деле является датой - PullRequest
0 голосов
/ 06 ноября 2019

Я пишу тесты для компонента, который является параметром в методе @RestController. Боб POJO:

public class AddTownRequestBean
{
    @NotEmpty(message = "INVALID_REQUEST")
    @Length(min = 1, max = 30, message = "PARAMETER_OUT_OF_BOUNDS")
    private String name;
    @NotEmpty(message = "INVALID_REQUEST")
    @Length(min = 3, max = 4, message = "PARAMETER_OUT_OF_BOUNDS")
    private String typeCreated;
    @DateTimeFormat(pattern = "yyyy-MM-dd") //style = "S-", iso = DateTimeFormat.ISO.DATE,
    private String foundationDate;

    getters and setters...
}

Мой вопрос связан с аннотацией @DateTimeFormat. В документации указано, что эта аннотация:

Может применяться к java.util.Date, java.util.Calendar, Long (для отметок времени в миллисекундах), а также к JSR. -310 типов значений java.time и Joda-Time.

Как видно, поддержка простого типа String не поддерживается, но поле даты в моем POJO равно String. Я уже тестировал, используя @DateTimeFormat, как описано выше, также с закомментированными параметрами, каждый раз взаимно исключаемыми. И, очевидно, это не сработало.

Таким образом, сам вопрос - есть ли аннотация или подобный обходной путь для добавления (давайте назовем это) «валидатора» для определенного формата даты в переменной типа String, котораядолжно быть свидание?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Этот вопрос или похожий ранее был задан и получен ответ. Ниже ссылка на предыдущий вопрос. Пожалуйста, посмотрите, поможет ли вам этот ответ.

Проверка даты строки Java с использованием Hibernate API

0 голосов
/ 06 ноября 2019

Вы можете создать собственную аннотацию валидатора для этого случая. Пример

DateTimeValid.class

@Constraint(validatedBy = DateTimeValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeValid{

    public String message() default "Invalid datetime!";
    public String fomart() default "MM/dd/yyyy";
    public Class<?>[] groups() default {};
    public Class<? extends Payload>[] payload() default {};
}

DateTimeValidator.class

public class DateTimeValidator implements ConstraintValidator<DateTimeValid, String> {

    private String dateFormat;

    @Override
    public void initialize(DateTimeValid constraintAnnotation) {
        dateFormat = constraintAnnotation.fomart();
    }

    @Override
    public boolean isValid(String strDate, ConstraintValidatorContext context) {
        try {
            DateFormat sdf = new SimpleDateFormat(this.dateFormat);
            sdf.setLenient(false);
            sdf.parse(strDate);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}

Использование

@DateTimeValid(fomart="...", message="...")
private String foundationDate;

Редактировать: @Ramu: Этот код из моего проекта я сделал раньше. Но да, я прочитал ссылку, и это та же идея с кодом выше

...