springboot使⽤注解校验参数javax.validation和hibernate-。。。springboot使⽤注解参数校验 javax.validation 和 hibernate-validator
1. 参数校验概述
1.1 需求概述
常见的业务开发中⽆可避免的会进⾏请求参数校验,⼀般对于复杂的业务参数校验,可以通过校验类单独的校验⽅法进⾏处理,通常对于⼀些与业务⽆关简单的参数校验可以采⽤javax.validation 和 hibernate-validator通过注解的⽅式实现校验。
1.2 validation与validator
javax的validation是Java定义的⼀套基于注解的数据校验规范,⽬前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR
380的2.0版本(2.0完成于2017.08),已经经历了三个版本。
需要注意的是,JSR只是⼀项标准,它规定了⼀些校验注解的规范,但没有实现,⽐如@Null、@NotNull、@Pattern等,它们位于straints这个包下。⽽hibernate validator是对这个规范的实现,并增加了⼀些其他校验注解,如 @NotBlank、
@NotEmpty、@Length等,它们位于org.straints这个包下。
如果我们的项⽬使⽤了Spring Boot,hibernate validator框架已经集成在 spring-boot-starter-web中,所以⽆需再添加其他依赖。如果不是Spring Boot项⽬,需要添加如下依赖。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
2 注解说明
2.1 validator内置注解
注解说明
@Null被注释的元素必须为null
@NotNull被注释的元素不能为null
@AssertTrue被注释的元素必须为true
@AssertFalse被注释的元素必须为false
@Min(value)被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@Max(value)被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
@DecimalMin(value)被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@DecimalMax(value)被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
@Size(max,min)被注释的元素的⼤⼩必须在指定的范围内
@Digits(integer, fraction)被注释的元素必须是⼀个数字,其值必须必须在可接受的范围内
@Past被注释的元素必须是⼀个过去的⽇期
@Future被注释的元素必须是⼀个将来的⽇期
@Pattern(value)被注释的元素必须符合指定的正则表达式
2.2 hibernate validator扩展定义注解
注解说明
@NotBlank被注释的元素不能为null,且长度必须⼤于0,只能⽤于注解字符串
@NotEmpty被注释的元素值不为null且不为空,⽀持字符串、集合、Map和数组类型
@Length(min=,max=)检查所属的字段的长度是否在min和max之间,只能⽤于字符串
@Email被注释的元素必须是电⼦邮箱地址
@Range(min=,max=,message=)被注释的元素必须在合适的范围内
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
注意:
1.正则表达式@Pattern注解只⽤于String类型的字段上。数字类型的可⽤@Range注解。
2.需要在Controller中请求对象或者参数前加@Validated或@Valid注解⼀起使⽤,
@Validated和@Valid注解区别不是很⼤,⼀般情况下任选⼀个即可,区别如下:
注解@Validated@Valid
所属的包属于org.springframework.validation.annotation包下的,是spring提供的属于javax.validation包下,是jdk给提供的是否⽀持分组和排序是否
虽然@Validated⽐@Valid更加强⼤,在@Valid之上提供了分组功能和验证排序功能,不过在实际项⽬中⼀直没有⽤到过 Hibernate-validate框架中的注解是需要加在实体中⼀起使⽤的
3. 实现验证
3.1 引⼊依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"xsi="/2001/XMLSchema-instance"
schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
validation框架<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<groupId&le</groupId>
<artifactId>category</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>category</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId&batis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
<version>2.1.4</version>
</dependency>
<!--数据库连接诶-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--常⽤⼯具-->
<dependency>
<groupId&le.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--字段校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2 代码实现
1.实体类
import ApiModel;
import ApiModelProperty;
import Data;
import Length;
import Range;
import*;
/**
* 员⼯实体类
*
* @author zrj
* @since 2021/7/31
**/
@Data
@ApiModel(value ="Employee", description ="员⼯信息")
public class Employee {
@NotNull(message ="userId is empty")
@ApiModelProperty(value ="员⼯ID")
private Integer id;
@NotBlank(message ="员⼯姓名不能为空")
@Length(min =1, max =100, message ="员⼯姓名长度不能超过50字")
@ApiModelProperty(value ="员⼯姓名")
private String name;
@Range(min =1, max =200, message ="年龄范围[1,200]")
@ApiModelProperty(value ="年龄")
private Integer age;
@Pattern(regexp ="^[0-1]$", message ="员⼯类型范围[0,1]")
@ApiModelProperty(value ="员⼯类型(0⾏政岗;1基础岗")
private String type;
@Pattern(regexp ="^[1][^0^1^2][0-9]{9}$", message ="员⼯⼿机号码不合法") @ApiModelProperty(value ="员⼯⼿机号码")
private String phone;
@Email(message ="员⼯邮箱不合法")
@Length(min =1, max =50, message ="员⼯邮箱长度")
@ApiModelProperty(value ="员⼯邮箱")
private String email;
@Length(min =0, max =200, message ="备注长度不能超过100字")
@ApiModelProperty(value ="备注")
private String remarks;
}
2.控制类
import Employee;
import Response;
import Api;
import ApiOperation;
import*;
import Valid;
/**
* 员⼯控制类
*
* @author zrj
* @since 2021/7/31
**/
@RestController
@RequestMapping("/employee")
@Api(value ="employee", description ="员⼯管理")
public class EmployeeController {
@GetMapping("/test")
@ApiOperation(value ="test测试", notes ="test测试", httpMethod ="GET")
public Response test(){
return Response.success("查询成功",null);
}
/**
* Valid测试
* 这⾥职位测试@Valid,所以不在写其他各层
*/
@PostMapping("/validEpmloyee")
@ApiOperation(value ="Valid测试", notes ="Valid测试", httpMethod ="POST")
public Response<Employee>validEpmloyee(@Valid@RequestBody Employee employee){ System.out.println("测试请求对象:"+ employee);
if(employee !=null){
return Response.success("查询成功", employee);
}
return Response.fail("查询失败");
}
}
3.结果集响应码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论