【发布时间】:2017-10-02 19:21:15
【问题描述】:
遵循本指南:https://spring.io/guides/gs/validating-form-input/ 后,我想做表单验证,检查 dateTo 值是否在 dateFrom 值之前。如果有某种注释解决方案,那就太棒了。它们作为字符串存储在我的表单提供的空模型中。
@NotNull(message="You must select a date.")
@NotBlank(message="You must select a date.")
private String dateFrom;
@Min(dateFrom)
private String dateTo;
显然这行不通,因为我们无法比较一个字符串是否比另一个小...有替代方案吗?问题是我想从表单验证检查中直接在 UI 中提供一条消息,就像我如何检查消息是 null 还是空白一样。
// Create Request
@RequestMapping(value = "/save", method = RequestMethod.POST)
String saveRequest(Principal principal, @Valid @ModelAttribute(value = "requestModel") RequestModel requestModel, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
....
if (bindingResult.hasErrors()) {
// log.info("There are binding errors.");
return "send";
}
....
// Format given date
Date dateFrom = null;
try {
SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
dateFrom = formatter.parse(requestModel.getDateFrom());
} catch (ParseException e) {
e.printStackTrace();
return "send";
}
try {
if (requestModel.getDateTo() != null && !(requestModel.getDateTo().isEmpty())) {
SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.dateFormat);
Date dateTo = formatter.parse(requestModel.getDateTo());
// Check if dateTo is before dateFrom
if (!dateTo.before(dateFrom)) {
// If not (proper case), set the date
requestDOOb.setDateTo(dateTo);
} else {
// Improper case, log error
//TODO Update UI?
log.info("dateTo cannot come before dateFrom");
return "send";
}
} else {
requestDOOb.setDateTo(dateFrom);
}
} catch (ParseException e) {
e.printStackTrace();
return "send";
}
我不想在 POST 方法本身中执行验证...
更新:
@AssertTrue(message="The end date cannot come before the initial date.")
private boolean isValid() {
return !dateTo.before(dateFrom) && this.dateFrom.before(this.dateTo);
}
public Date getDateFrom() {
return dateFrom;
}
public void setDateFrom(Date dateFrom) {
this.dateFrom = dateFrom;
}
public Date getDateTo() {
return dateTo;
}
public void setDateTo(Date dateTo) {
this.dateTo = dateTo;
}
像上面这样的呢?
【问题讨论】:
-
您是在寻找一个可以让您指定要比较的任意属性的注释,还是一个类级别的注释 (
@ValidDates) 就足够了? -
我在上面添加了一个可能的解决方案。我基本上是想在 Springboot 表单验证绑定中比较结束日期是否早于初始日期。
-
你的方法很好,很好,很简单。有什么不工作吗?如果您想稍后重用它,您始终可以使用自定义验证器进行自定义注释。那时可能不得不引入一个接口。类似
HasFromToDates -
我唯一的问题是我希望模型中发送的日期是字符串,然后再转换它们,所以自定义验证器会更好,因为我可以将字符串解析为日期,运行检查,然后更新 UI。
标签: java validation spring-mvc spring-boot