# Spring MVC 自定义验证器示例

> 原文： [https://howtodoinjava.com/spring-mvc/spring-mvc-custom-validator-example/](https://howtodoinjava.com/spring-mvc/spring-mvc-custom-validator-example/)

在 [**spring mvc 表单提交教程**](https://howtodoinjava.com/spring/spring-mvc/spring-mvc-display-validate-and-submit-form-example/)中，我们学习了如何显示显示表单和提交表单数据，包括使用`BindingResult.rejectValue()`验证输入。 在此示例中，我们将学习为`EmployeeVO`模型对象构建更强大的验证器。 该验证器是 **`Validator`** 接口的自定义实现。 在此示例中，我将修改上一个教程中构建的表单提交示例所使用的代码。

> **阅读更多： [Spring MVC 显示，验证和提交表单示例](https://howtodoinjava.com/spring/spring-mvc/spring-mvc-display-validate-and-submit-form-example/)**

[**下载源码**](https://drive.google.com/file/d/0B7yo2HclmjI4WFFvOVAwNFRVV1E/view?usp=sharing)

## 自定义验证器实现

Spring MVC 通过实现`Validator`接口的验证器对象来支持验证。 您可以编写以下验证器来检查是否填写了必需的表单字段。

```java
package com.howtodoinjava.demo.validator;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.howtodoinjava.demo.model.EmployeeVO;

@Component
public class EmployeeValidator implements Validator 
{

	public boolean supports(Class clazz) {
		return EmployeeVO.class.isAssignableFrom(clazz);
	}

	public void validate(Object target, Errors errors) 
	{
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "error.firstName", "First name is required.");
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "error.lastName", "Last name is required.");
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "error.email", "Email is required.");
	}

}

```

在此验证器中，您可以使用`ValidationUtils`类中的`rejectIfEmptyOrWhitespace()`和`rejectIfEmpty()`之类的实用方法来验证所需的表单字段。 如果这些表单字段中的任何一个为空，这些方法将创建一个字段错误并将其绑定到该字段。 这些方法的第二个参数是属性名称，而第三个和第四个是错误代码和默认错误消息。

很多时候，验证错误并非特定于字段。 例如，结束日期应大于开始日期。 在这种情况下，可以使用`reject()`方法创建要绑定到`EmployeeVO`对象而不是字段的对象错误。

例如`errors.reject("invalid.dateDiff", "结束日期应大于开始日期。");`

要将此自定义验证器激活为 spring 托管 bean，您需要执行以下操作之一：

1）在`EmployeeValidator`类中添加[`@Component`](https://howtodoinjava.com/spring/spring-core/how-to-use-spring-component-repository-service-and-controller-annotations/)注解，并在包含此类声明的包上激活注解扫描。

```java
<context:component-scan base-package="com.howtodoinjava.demo" />

```

2）或者，您可以直接在上下文文件中注册验证器类 bean。

```java
<bean id="employeeValidator" class="com.howtodoinjava.demo.validator.EmployeeValidator" />

```

## 控制器变更

要应用此验证器，您需要对控制器执行以下修改。

1）包括控制器类的验证器引用，并对其进行自动标记，以确保在需要时可用。

```java
@Autowired
EmployeeValidator validator;

```

2）下一个更改是在控制器的 post 方法中，该方法在用户提交表单时调用。

```java
@RequestMapping(method = RequestMethod.POST)
public String submitForm(@ModelAttribute("employee") EmployeeVO employeeVO,
						BindingResult result, SessionStatus status) 
{

	//Validation code
	validator.validate(employeeVO, result);

	//Check validation errors
	if (result.hasErrors()) {
		return "addEmployee";
	}

	//Store the employee information in database
	//manager.createNewRecord(employeeVO);

	//Mark Session Complete
	status.setComplete();
	return "redirect:addNew/success";
}

```

验证方法返回后，结果参数（即`BindingResult`）将包含验证过程的结果。 您可以使用`result.hasErrors()`方法调用检查输入是否有错误。 如果检测到任何错误，您可以再次渲染表单视图，以使用户更正其输入。

如果未发现错误，则`result.hasErrors()`将返回`false`，然后您可以简单地处理输入并将用户重定向到下一个视图。

本示例中使用的完整源代码敌人控制器如下：

```java
package com.howtodoinjava.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import com.howtodoinjava.demo.model.EmployeeVO;
import com.howtodoinjava.demo.service.EmployeeManager;
import com.howtodoinjava.demo.validator.EmployeeValidator;

@Controller
@RequestMapping("/employee-module/addNew")
@SessionAttributes("employee")
public class EmployeeController 
{
	@Autowired
	EmployeeManager manager;

	@Autowired
	EmployeeValidator validator;

	@RequestMapping(method = RequestMethod.GET)
    public String setupForm(Model model) 
	{
		 EmployeeVO employeeVO = new EmployeeVO();
		 model.addAttribute("employee", employeeVO);
		 return "addEmployee";
    }

	@RequestMapping(method = RequestMethod.POST)
    public String submitForm(@ModelAttribute("employee") EmployeeVO employeeVO,
            				BindingResult result, SessionStatus status) 
	{

		validator.validate(employeeVO, result);

		if (result.hasErrors()) {
			return "addEmployee";
		}
		//Store the employee information in database
		//manager.createNewRecord(employeeVO);

		//Mark Session Complete
		status.setComplete();
		return "redirect:addNew/success";
    }

	@RequestMapping(value = "/success", method = RequestMethod.GET)
    public String success(Model model) 
	{
		 return "addSuccess";
    }
}

```

[**下载源码**](https://drive.google.com/file/d/0B7yo2HclmjI4WFFvOVAwNFRVV1E/view?usp=sharing)

将您的问题放到我的评论部分。

**祝您学习愉快！**