13【JSR303校验】

本文介绍了JSR303(BeanValidation)规范,它是JAVAEE6的一部分,用于JavaBean字段的验证。HibernateValidator是其官方参考实现。文章详细讲解了JSR303提供的内置和HibernateValidator额外的约束注解,并展示了如何在SpringMVC中集成HibernateValidator进行数据校验,包括实体对象的注解配置和测试代码示例。
摘要由CSDN通过智能技术生成


七、JSR303校验

7.1 JSR303 简介

Java Specification Requests:Java 规范提案简称JSR;JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。

7.2 JSR303提供的约束

Tips:JSR303只是一个规范,我们具体的实现使用Hibernate Validator

  • JSR303 中内置的约束:
约束说明
@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中的正则表达式
  • Hibernate Validator新增的约束:
约束说明
@Email被标注字段必须是一个合法的邮箱
@Length被标注字段必须在指定长度内
@NotEmpty被标注字段必须必须非空
@Range被标注的字段必须在指定范围内

7.3 数据校验

引入Hibernate-validator依赖:

<!--hibernate对JSR303的支持-->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.0.Final</version>
</dependency>

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
</dependency>

实体对象:

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不能为null
    private 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                          // 必须是合法email
    private String email;           // 邮箱

    @AssertTrue                     // 必须是true
    private 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 {

    @Test
    public 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<ConstraintViolation<Emp>> violations = validator.validate(emp);

        if (violations != null && violations.size() > 0) {
            for (ConstraintViolation<Emp> violation : violations) {
                // 获取到每一个校验清单,打印清单值
                System.out.println("Validation problem : " + violation.getMessage());
            }
        }
    }
}

7.4 SpringMVC 数据校验

  • 准备表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/demo01/demo01" method="post">
    员工ID:<input type="text" name="id">
    员工姓名:<input type="text" name="name">
    员工年龄:<input type="text" name="age">
    员工邮箱:<input type="text" name="email">
    员工性别:<input type="text" name="sex">
    员工薪资:<input type="text" name="salary">
    出生日期:<input type="text" name="birthday">
    <input type="submit">
</form>

</body>
</html>
  • Controller:
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) {
            // 说明有校验失败的字段

            // 获取所有验证不通过的field
            List<FieldError> 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

緑水長流*z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值