很难想象没有针对用户数据的验证逻辑的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";
@Override
public boolean supports(Class clazz) {
return Shop.class.isAssignableFrom(clazz);
}
@Override
public 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.
让我们转到控制器的代码:
...
@Autowired
private ShopValidator shopValidator;
@InitBinder
private 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