很难想象没有针对用户数据的验证逻辑的Web应用程序。 几乎所有用户的数据都有一些限制,例如,出生日期应由日,月,年等组成。SpringMVC拥有自己的数据验证解决方案,并且在Validator界面的帮助下可用。
Spring MVC Validator的用法
当您从用户那里收到某种数据时,及时进行验证是有意义的。 一种明显的方法是使用Web表单。 Validator接口是一种实现整个Spring MVC应用程序验证逻辑的方法。 听起来很有前途。
要开始使用Validator,需要做三件事:
- 为某些域模型创建一个验证器类,并实现Validator接口。
- 重载support(Class clazz)方法。
- 重载validate(Object target,Errors errors)方法。
现在,您已经知道Validator接口用法的基础知识。 理论够了,让我们继续实践。
Vlidator Spring MVC示例
我想在先前的教程之一中演示Validator接口的实际作用,其中的验证不会多余。 我的意思是带有Spring Data的示例应用程序。 首先,您需要更新pom.xml文件,添加以下依赖项:
...<dependency><groupid>javax.validation</groupid><artifactid>validation-api</artifactid><version>1.0.0.GA</version></dependency><dependency><groupid>org.hibernate</groupid><artifactid>hibernate-validator</artifactid><version>4.3.0.Final</version></dependency>
...
在项目中,我有一个POJO:
@Entity @Table(name = "shops") public class Shop { @Id @GeneratedValue private Integer id; private String name; @Column(name = "employees_number") private Integer emplNumber; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getEmplNumber() { return emplNumber; } public void setEmplNumber(Integer emplNumber) { this.emplNumber = emplNumber; } }
因此,让我们为其创建验证规则:
- “名称”不能为空。
- “ emplNumber”不能为空。
- “ emplNumber”不能小于1。
用于这些目的的验证类如下所示:
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;import com.spr.model.Shop;@Component
public class ShopValidator implements Validator {private final static String EMPLOYEES_NUMBER = "emplNumber";@Overridepublic boolean supports(Class clazz) {return Shop.class.isAssignableFrom(clazz);}@Overridepublic void validate(Object target, Errors errors) {Shop shop = (Shop) target;Integer emplNumber = shop.getEmplNumber();ValidationUtils.rejectIfEmpty(errors, "name", "shop.name.empty");ValidationUtils.rejectIfEmpty(errors, EMPLOYEES_NUMBER, "shop.emplNumber.empty");if (emplNumber != null && emplNumber < 1)errors.rejectValue(EMPLOYEES_NUMBER, "shop.emplNumber.lessThenOne");}}
注意,我将@Component注释应用于该类,因为我计划稍后将其注入ShopController。 这是验证器方法的说明:
support(Class)–此验证程序可以验证提供的Class的实例吗? validate(Object,org.springframework.validation.Errors)–验证给定的对象,并在验证错误的情况下,使用给定的Errors对象注册那些对象。 有关更多信息,请参见ValidationUtils类的javadoc。 验证期间将显示的消息应放在“ messages.properties”文件中:
shop.name.empty = The "Shop name" field can't be empty.
shop.emplNumber.empty = The "Employees number" field can't be empty.
shop.emplNumber.lessThenOne = The number of employees can't be less then 1.
让我们转到控制器的代码:
...@Autowiredprivate ShopValidator shopValidator;@InitBinderprivate void initBinder(WebDataBinder binder) {binder.setValidator(shopValidator);}
...@RequestMapping(value="/create", method=RequestMethod.POST)public ModelAndView createNewShop(@ModelAttribute @Valid Shop shop,BindingResult result,final RedirectAttributes redirectAttributes) {if (result.hasErrors())return new ModelAndView("shop-new");ModelAndView mav = new ModelAndView();String message = "New shop "+shop.getName()+" was successfully created.";shopService.create(shop);mav.setViewName("redirect:/index.html");redirectAttributes.addFlashAttribute("message", message); return mav; }
...
上面的代码片段演示了在控制器层中需要执行的主要操作,以实现验证:
- 验证器的自动装配。
- 将验证器添加到InitBinder 。
- 将@Valid注释应用于具体控制器中的模型。
最后,让我们看一下JSP:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<h1>New Shop page</h1>
<form:form method="POST" commandname="shop" action="${pageContext.request.contextPath}/shop/create.html">
<table>
<tbody>
<tr>
<td>Shop name:</td>
<td><form:input path="name"></form:input></td>
<td><form:errors path="name" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td>Employees number:</td>
<td><form:input path="emplNumber"></form:input></td>
<td><form:errors path="emplNumber" cssstyle="color: red;"></form:errors></td>
</tr>
<tr>
<td><input value="Create" type="submit"></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</form:form>
...
请注意form:errors标记,它们负责显示错误消息。
摘要
Validator接口允许为应用程序中的每个域模型对象创建灵活的验证层。 它是标准JSR-303验证批注(例如@ Min,@ Max,@ NotNull,@ Size等)的不错选择。您可以在GitHub上找到示例的完整版本。
翻译自: https://www.javacodegeeks.com/2013/06/spring-mvc-validator-and-initbinder.html