spring 数据校验之Hibernate validation
1、需要的jar包
2、springsevlet-config.xml配置
在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置引入,只需要在配置xml中加入,这时validatemessage的属性文件默认为classpath下的ValidationMessages.properties:
<!-- support JSR303 annotation if JSR 303 validation present on classpath --> <mvc:annotation-driven />
如果不使用默认,可以使用下面配置:
<mvc:annotation-driven validator="validator" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!--不设置则默认为classpath下的ValidationMessages.properties --> <property name="validationMessageSource" ref="validatemessageSource"/> </bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:validatemessages"/> <property name="fileEncodings" value="utf-8"/> <property name="cacheSeconds" value="120"/> </bean>
3、hibernate validator constraint 注解
1 Bean Validation 中内置的 constraint 2 @Null 被注释的元素必须为 null 3 @NotNull 被注释的元素必须不为 null 4 @AssertTrue 被注释的元素必须为 true 5 @AssertFalse 被注释的元素必须为 false 6 @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 7 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 8 @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 9 @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 10 @Size(max=, min=) 被注释的元素的大小必须在指定的范围内 11 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 12 @Past 被注释的元素必须是一个过去的日期 13 @Future 被注释的元素必须是一个将来的日期 14 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 15 16 Hibernate Validator 附加的 constraint 17 @NotBlank(message =) 验证字符串非null,且长度必须大于0 18 @Email 被注释的元素必须是电子邮箱地址 19 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 20 @NotEmpty 被注释的字符串的必须非空 21 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
Demo:
编写自己的验证类:
1 package com.journaldev.spring.form.validator; 2 3 import org.springframework.validation.Errors; 4 import org.springframework.validation.ValidationUtils; 5 import org.springframework.validation.Validator; 6 7 import com.journaldev.spring.form.model.Employee; 8 /** 9 *自定义一个验证类由于对员工信息进项验证(实现Validator接口) 10 */ 11 public class EmployeeFormValidator implements Validator { 12 13 //which objects can be validated by this validator 14 @Override 15 public boolean supports(Class<?> paramClass) { 16 return Employee.class.equals(paramClass); 17 } 18 //重写validate()方法编写验证规则 19 @Override 20 public void validate(Object obj, Errors errors) { 21 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "id.required"); 22 23 Employee emp = (Employee) obj; 24 if(emp.getId() <=0){ 25 errors.rejectValue("id", "negativeValue", new Object[]{"'id'"}, "id can't be negative"); 26 } 27 28 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.required"); 29 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "role", "role.required"); 30 } 31 }
控制器代码:
1 package com.journaldev.spring.form.controllers; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Qualifier; 10 import org.springframework.stereotype.Controller; 11 import org.springframework.ui.Model; 12 import org.springframework.validation.BindingResult; 13 import org.springframework.validation.Validator; 14 import org.springframework.validation.annotation.Validated; 15 import org.springframework.web.bind.WebDataBinder; 16 import org.springframework.web.bind.annotation.InitBinder; 17 import org.springframework.web.bind.annotation.ModelAttribute; 18 import org.springframework.web.bind.annotation.RequestMapping; 19 import org.springframework.web.bind.annotation.RequestMethod; 20 21 import com.journaldev.spring.form.model.Employee; 22 23 @Controller 24 public class EmployeeController { 25 26 private static final Logger logger = LoggerFactory 27 .getLogger(EmployeeController.class); 28 29 private Map<Integer, Employee> emps = null; 30 31 @Autowired 32 @Qualifier("employeeValidator") 33 private Validator validator; 34 35 @InitBinder 36 private void initBinder(WebDataBinder binder) { 37 binder.setValidator(validator); 38 } 39 40 public EmployeeController() { 41 emps = new HashMap<Integer, Employee>(); 42 } 43 44 @ModelAttribute("employee") 45 public Employee createEmployeeModel() { 46 // ModelAttribute value should be same as used in the empSave.jsp 47 return new Employee(); 48 } 49 50 @RequestMapping(value = "/emp/save", method = RequestMethod.GET) 51 public String saveEmployeePage(Model model) { 52 logger.info("Returning empSave.jsp page"); 53 return "empSave"; 54 } 55 56 @RequestMapping(value = "/emp/save.do", method = RequestMethod.POST) 57 public String saveEmployeeAction( 58 @ModelAttribute("employee") @Validated Employee employee, 59 BindingResult bindingResult, Model model) { 60 if (bindingResult.hasErrors()) { 61 logger.info("Returning empSave.jsp page"); 62 return "empSave"; 63 } 64 logger.info("Returning empSaveSuccess.jsp page"); 65 model.addAttribute("emp", employee); 66 emps.put(employee.getId(), employee); 67 return "empSaveSuccess"; 68 } 69 }
员工类代码:
1 package com.journaldev.spring.form.model; 2 3 public class Employee { 4 5 private int id; 6 private String name; 7 private String role; 8 9 public int getId() { 10 return id; 11 } 12 public void setId(int id) { 13 this.id = id; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public String getRole() { 22 return role; 23 } 24 public void setRole(String role) { 25 this.role = role; 26 } 27 28 }
jsp页面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <%@ taglib uri="http://www.springframework.org/tags/form" 5 prefix="springForm"%> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9 <title>Employee Save Page</title> 10 <style> 11 .error { 12 color: #ff0000; 13 font-style: italic; 14 font-weight: bold; 15 } 16 </style> 17 </head> 18 <body> 19 20 <springForm:form method="POST" commandName="employee" 21 action="save.do"> 22 <table> 23 <tr> 24 <td>Employee ID:</td> 25 <td><springForm:input path="id" /></td> 26 <td><springForm:errors path="id" cssClass="error" /></td> 27 </tr> 28 <tr> 29 <td>Employee Name:</td> 30 <td><springForm:input path="name" /></td> 31 <td><springForm:errors path="name" cssClass="error" /></td> 32 </tr> 33 <tr> 34 <td>Employee Role:</td> 35 <td><springForm:select path="role"> 36 <springForm:option value="" label="Select Role" /> 37 <springForm:option value="ceo" label="CEO" /> 38 <springForm:option value="developer" label="Developer" /> 39 <springForm:option value="manager" label="Manager" /> 40 </springForm:select></td> 41 <td><springForm:errors path="role" cssClass="error" /></td> 42 </tr> 43 <tr> 44 <td colspan="3"><input type="submit" value="Save"></td> 45 </tr> 46 </table> 47 48 </springForm:form> 49 50 </body> 51 </html>