我想使用 Spring Boot 对表单进行验证。 对于同一字段,我想首先验证它是否为空并向用户显示错误消息,如果不是,我想验证它是否至少有 2 个且不超过 50 个字符。我的问题是,如果我不填写该字段,它会显示两条消息,而不是仅显示第一条消息(空消息)。我该如何解决它?
@Controller
public class BookController{
(...)
@RequestMapping(value="add-book", method=RequestMethod.POST)
public String addNewBook(ModelMap model, @Valid Book book, BindingResult result) {
if(result.hasErrors())
return "addUpdateBook";
bookService.addBook(book);
return "redirect:list-books";
}
(...)
}
addUpdateBook.jsp
(...)
<form:form method="post" modelAttribute="book">
<fieldset class="mb-3">
<form:label path="name">Name: </form:label>
<form:input type="text" path="name"/><br>
<form:errors path="name" cssClass="text-warning"/>
</fieldset>
</form>
Book.java
public class Book{
(...)
@NotBlank(message = "Name can not be null.")
@Size(min=2, max=50, message = "Name must be between {min} and {max} characters long.")
private String name;
(...)
Spring 实际上使用 hibernate 验证器来执行字段验证。 Hibernate 验证器具有“快速失败模式”,一旦发生第一个约束违规,该模式就会从当前验证中返回。 不幸的是,该属性没有在会话工厂级别公开。 在 Spring @configuration 中,您应该能够在 ValidatorFactory 上设置属性:
@Bean
public LocalValidatorFactoryBean getValidatorFactory() {
LocalValidatorFactoryBean localFactoryBean = new LocalValidatorFactoryBean();
localFactoryBean.getValidationPropertyMap().put("hibernate.validator.fail_fast", "true");
return localValidatorFactoryBean;
}
请记住,这是一个全局属性,因此现在应用程序中的所有验证都将以与快速失败打开相同的方式运行。