Java Specification Requests:Java 规范提案简称JSR;JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
Tips:JSR303只是一个规范,我们具体的实现使用Hibernate Validator
约束 | 说明 |
---|---|
@Null | 被标注字段必须为null |
@NotNull | 被标注字段必须不为null |
@AssertTrue | 被标注字段必须为true |
@AssertFalse | 被标注字段必须为false |
@Min(value) | 被标注字段必须是一个数字,并且值要大于等于value |
@Max(value) | 被标注字段必须是一个数字,并且值要小于等于value |
@DecimalMin(value) | 被标注字段必须是一个数字,并且值要大于等于value |
@DecimalMax(value) | 被标注字段必须是一个数字,并且值要小于等于value |
@Size(max,min) | 被标注字段必须是一个字符串,并且长度大于等于min,小于等于max |
@Digits(integer,fraction) | 被标注字段必须是一个数字,并且值必须在可接受的范围内 |
@Past | 被标注字段必须是一个已经过去的日期 |
@Future | 被标注字段必须是一个将来的日期 |
@Pattern(value) | 被标注字段必须复合value中的正则表达式 |
约束 | 说明 |
---|---|
被标注字段必须是一个合法的邮箱 | |
@Length | 被标注字段必须在指定长度内 |
@NotEmpty | 被标注字段必须必须非空 |
@Range | 被标注的字段必须在指定范围内 |
引入Hibernate-validator依赖:
org.hibernate hibernate-validator 5.1.0.Final
javax.el javax.el-api 3.0.0
org.glassfish.web javax.el 2.2.4
org.projectlombok lombok 1.18.22
junit junit 4.13.1 test
实体对象:
package com.dfbz.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Range;import javax.validation.constraints.*;
import java.util.Date;/*** @author lscl* @version 1.0* @intro:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {@NotNull // id不能为nullprivate Integer id; // 用户id@Size(min = 4, max = 8) // 姓名在4-8位之间private String name; // 员工姓名@Range(min = 18, max = 28, message = "年龄错了啊") // 年龄在18-28岁之间private Integer age; // 年龄@Email // 必须是合法emailprivate String email; // 邮箱@AssertTrue // 必须是trueprivate Boolean sex; // 性别 true:男 false:女@Digits(integer = 3, fraction = 2) // 整数位必须在3位小数内(包含3位),小数位必须在2位之内(包含2位)private Double salary; // 薪资@Past // 必须是一个已经过去的日期private Date birthday; // 出生日期
}
package com.dfbz.test;import com.dfbz.entity.Emp;
import org.junit.Test;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Date;
import java.util.Set;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01 {@Testpublic void test1() {Emp emp = new Emp(null,"administrator",38, "admin.com",false, 30.223D,new Date(System.currentTimeMillis()+1000));// 创建校验器工厂ValidatorFactory factory = Validation.buildDefaultValidatorFactory();// 通过工厂创建一个校验器Validator validator = factory.getValidator();// 通过校验器对指定的对象进行校验,获取校验清单Set> violations = validator.validate(emp);if (violations != null && violations.size() > 0) {for (ConstraintViolation violation : violations) {// 获取到每一个校验清单,打印清单值System.out.println("Validation problem : " + violation.getMessage());}}}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
package com.dfbz.controller;import com.dfbz.entity.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import javax.validation.Valid;
import java.util.List;/*** @author lscl* @version 1.0* @intro:*/
@Controller
@RequestMapping("/demo01")
public class Demo01Controller {/*** @param emp* @param result: 接收校验失败的信息,如果都校验成功则为空,如果没有BindingResult,则校验失败出现400错误* @Valid: 启用JSR303校验*/@RequestMapping("/demo01")public ModelAndView demo01(@Valid Emp emp, BindingResult result) {ModelAndView mv=new ModelAndView("/success.jsp");if (result != null && result.getErrorCount() > 0) {// 说明有校验失败的字段// 获取所有验证不通过的fieldList fieldErrors = result.getFieldErrors();for (FieldError fieldError : fieldErrors) {System.out.println(fieldError.getField() + ": " + fieldError.getDefaultMessage());mv.addObject(fieldError.getField(),fieldError.getDefaultMessage());}mv.setViewName("/error.jsp");}System.out.println(emp);return mv;}
}