如何在视图中显示@AssertTrue触发的跨字段校验提示信息
表单跨字段日期校验提示不显示的解决方案
先修正代码中的低级错误
你写的isvalid()方法里误用了startingDateTime和endingDateTime变量,但类中实际定义的是startDate和endDate,这会直接导致校验逻辑失效;另外startDate和endDate未加非空校验,用户未填日期时调用isBefore会触发空指针异常。先把代码调整为:
public class CreateEventForm { private Long id; @NotBlank(message = "Field title is required.") private String name; @NotNull(message = "Start date is required.") private LocalDateTime startDate; @NotNull(message = "End date is required.") private LocalDateTime endDate; @AssertTrue(message = "Start date must be before end date.") public boolean isValid() { // 已加@NotNull校验,此处判空为双重保险 if (startDate == null || endDate == null) { return true; } return startDate.isBefore(endDate); } }
解决提示消息不显示的问题
@AssertTrue属于类级别校验,默认错误消息会被归类为全局错误,而非单个字段的错误,所以仅在字段旁添加错误提示是看不到的。有两种解决方式:
方式一:页面显示全局错误
如果使用Spring MVC表单标签,直接在页面添加全局错误展示标签即可显示该提示:
<form:errors cssClass="error" />
这个标签会展示所有全局校验错误,包括@AssertTrue生成的消息。
方式二:将错误绑定到指定字段
如果希望提示显示在endDate输入框旁,可替换为Hibernate Validator的@ScriptAssert注解,指定错误绑定到endDate字段:
@ScriptAssert(lang = "javascript", script = "_this.startDate == null || _this.endDate == null || _this.startDate.isBefore(_this.endDate)", message = "Start date must be before end date.", reportOn = "endDate") public class CreateEventForm { private Long id; @NotBlank(message = "Field title is required.") private String name; @NotNull(message = "Start date is required.") private LocalDateTime startDate; @NotNull(message = "End date is required.") private LocalDateTime endDate; // 删除原有的isValid方法 }
此时错误消息会绑定到endDate字段,页面中针对endDate的错误提示标签就能显示这条信息:
<form:errors path="endDate" cssClass="error" />
最后确认Controller的校验触发逻辑
务必在Controller中用@Valid标记表单对象,并绑定BindingResult接收错误,否则校验不会生效:
@PostMapping("/create-event") public String createEvent(@Valid CreateEventForm form, BindingResult result, Model model) { if (result.hasErrors()) { return "create-event"; // 校验失败返回表单页面 } // 校验成功后处理业务逻辑 return "success"; }
内容的提问来源于stack exchange,提问作者Katie201
相关产品推荐
相关产品推荐

