Как проверить между двумя датами, используя LocalTime, используя Springboot и Thymeleaf - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть класс с этим полем в:

@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate passDate;

Я создал две переменные LocalDate, которые я хочу проверить между (например)

LocalDate a = LocalDate.of(1995, 1, 01); LocalDate b = LocalDate.of(2140, 12, 31);

Я использовал @PastOrPresent, но это не мешает пользователям вводить дату, например, 3050 год.

Я начал создавать метод в классе домена, где находится поле passDate, однако я действительно не знаю, гдеидет проверка и как вызвать этот метод проверки.(Вот фрагмент того, что я пытался сделать, но не уверен, куда его поставить? (Может быть, это тоже неправильно!))

if (!(passDate.isBefore(a) && passDate.isAfter(b))) {
return passDate; }

Не был уверен, к чему это приведет?Какой метод?Как я могу назвать это подтверждение?или есть другой способ.Я долго смотрел онлайн и не могу понять, что делать.У меня есть форма чабреца с этим полем (которая использовала проверку PastOrPresent для возврата сообщения об ошибке при отправке)

            <div class="form-group">
                <label for="pass_date">Enter the pass date</label>
                <input type="date" th:field="*{passDate}" name="pass_date" id="pass_date"
                       class="form-control"/>
                <p class="text-danger" th:if="${#fields.hasErrors('passDate')}" th:errors="*{passDate}"></p>
            </div>

Вот почтовый контроллер

@PostMapping("/admin/examform")
public String createExamForm(@ModelAttribute("examform") @Valid Examform examform,
                                    BindingResult bindingResult,
                                    @AuthenticationPrincipal final User user, Model model){
    if (bindingResult.hasErrors()) {
        System.out.println(bindingResult.getAllErrors());
        model.addAttribute("examform", examform);
        return "examformhtml";
    }else{
        examformservice.createExamForm(examform);
        model.addAttribute("loggedInUsername", user.getUsername());
        return "examformsuccess";
    }

}

Где examformservice - этопеременная класса моего сервиса, которая ссылается на мой репозиторий,

@Override
public void createExamForm(Examform examform) {
    String sql = "UPDATE examform SET passDate=? WHERE studentId=?";
    jdbcTemplate.update(sql, examform.getPassDate(), examform.getStudentId());

}

Куда я положу валидацию?и что будет вход?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Если вы хотите аннотацию JSR, вы можете по-своему перейти от этой:

@Constraint(validatedBy=AfterValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface After {
    String message() default "must be after {value}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String value();
}

и ее валидатора:

public class AfterValidator implements ConstraintValidator<After, LocalDate> {

    private LocalDate date;

    public void initialize(After annotation) {
        date = LocalDate.parse(annotation.value());
    }

    public boolean isValid(LocalDate value, ConstraintValidatorContext context) {
        boolean valid = true;
        if (value != null) {
            if (!value.isAfter(date)) {
                valid = false;
            }
        }
        return valid;
    }
}

Приведенное выше описание является эксклюзивным (точная дата будетнедействительно), вы можете настроить его.

Чтобы использовать его, нужно только добавить аннотацию в bean-компонент модели:

@After("1995-01-01")
private LocalDate passDate;

Обратное (@Before) Я оставляю вас в качестве упражнения:)

0 голосов
/ 11 декабря 2018

Вы должны проверить это, прежде чем назначить это поле.Таким образом, в форме отправки вы делаете что-то вроде этого:

LocalDate input = ...;
if (!(input.isBefore(a) && input.isAfter(b))) {
    // set the field
} else {
    // handle error here
    // throw exception or just print something
}
...