如何使用Springboot和Thymeleaf使用LocalTime在两个日期之间进行验证

时间:2018-12-11 19:37:21

标签: java spring-boot thymeleaf localdate

我在以下位置有一个与此字段有关的课程:

@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 :(得分:0)

在将其分配给字段之前,您需要检查它。因此,在您的表单提交中,您需要执行以下操作:

first.second.third.Fourth

答案 1 :(得分:0)

如果您想使用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)我留给您练习:)