原文网址:SpringBoot--用hibernate validator手动校验--方法/实例_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍如何使用validator进行手动校验。
validator可以进行自动校验,也可以进行手动校验。自动校验见下方“自动校验”。
自动校验
自动校验的方法:项目中我们经常在请求类上加@NotNull,@NotBlank之类的注解,结合@Valid或者@Validated,即可自动对字段进行校验。自动校验的用法见:SpringBoot--参数校验--@Valid/@Validated--使用/实例_IT利刃出鞘的博客-CSDN博客
依赖
只需引入Spring的Validation即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
它里边依赖了hibernate validator,就是下边这个
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_Knife4j</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_Knife4j</name>
<description>demo_Knife4j</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!--knife4j已经有了@Valid的依赖,本依赖更完整(有@Validated的依赖)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
工具类
package com.example.demo.business.manual.util;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import java.util.Set;
/**
* hibernate validator的校验工具
*/
public class ValidateUtil {
private static final Validator validator =
Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校验实体类
*/
public static <T> void validate(T t) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
if (constraintViolations.size() > 0) {
StringBuilder validateError = new StringBuilder();
for (ConstraintViolation<T> constraintViolation : constraintViolations) {
validateError.append(constraintViolation.getMessage()).append(";");
}
throw new ValidationException(validateError.toString());
}
}
/**
* 通过组来校验实体类
*/
public static <T> void validate(T t, Class<?>... groups) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t, groups);
if (constraintViolations.size() > 0) {
StringBuilder validateError = new StringBuilder();
for (ConstraintViolation<T> constraintViolation : constraintViolations) {
validateError.append(constraintViolation.getMessage()).append(";");
}
throw new ValidationException(validateError.toString());
}
}
}
配置类
package com.example.demo.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableOpenApi
// @EnableKnife4j
// @EnableSwagger2
public class Knife4jConfig {
@Bean
public Docket docket() {
Docket docket = new Docket(DocumentationType.OAS_30)
.apiInfo(new ApiInfoBuilder()
.title("我的标题")
.description("我的描述")
// .termsOfServiceUrl("http://www.xx.com/")
.contact(new Contact("knife", "https://knife.blog.csdn.net/", "[email protected]"))
.version("1.0")
.build())
// 分组名称
.groupName("all")
.select()
// 这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage("com.example.demo"))
.paths(PathSelectors.any())
.build();
return docket;
}
}
Controller
package com.example.demo.business.manual.controller;
import com.example.demo.business.manual.dto.UserDTO;
import com.example.demo.business.manual.group.ValidGroup;
import com.example.demo.business.manual.request.UserAddReq;
import com.example.demo.business.manual.request.UserEditReq;
import com.example.demo.business.manual.request.UserQueryReq;
import com.example.demo.business.manual.util.ValidateUtil;
import com.example.demo.business.normal.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "手动校验")
@RequestMapping("manualValidate")
@RestController
public class ManualController {
@ApiOperation("添加")
@PostMapping("/add")
public UserVO add(@RequestBody UserAddReq userAddReq) {
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(userAddReq, userDTO);
// ValidUtil.validate(userDTO);
ValidateUtil.validate(userDTO, ValidGroup.Add.class);
// 将数据写到数据库
userDTO.setId(1L);
userDTO.setCreateTime(LocalDateTime.now());
userDTO.setUpdateTime(LocalDateTime.now());
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userDTO, userVO);
return userVO;
}
@ApiOperation("修改")
@PostMapping("/edit")
public UserVO edit(@RequestBody UserEditReq userEditReq) {
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(userEditReq, userDTO);
ValidateUtil.validate(userDTO, ValidGroup.Edit.class);
// 修改数据库的数据
UserVO userVO = new UserVO();
BeanUtils.copyProperties(userEditReq, userVO);
userVO.setUpdateTime(LocalDateTime.now());
return userVO;
}
@ApiOperation("查找")
@GetMapping("/find")
public List<UserVO> find(UserQueryReq userQueryReq) {
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(userQueryReq, userDTO);
ValidateUtil.validate(userDTO, ValidGroup.Query.class);
return new ArrayList<>();
}
@ApiOperation("删除")
@PostMapping("/delete")
public void delete(Long id) {
// 将数据库数据删除
}
}
请求类
添加
package com.example.demo.business.manual.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("添加用户")
public class UserAddReq {
@ApiModelProperty(value = "用户名", required = true)
private String userName;
@ApiModelProperty("昵称")
private String nickName;
@ApiModelProperty("邮箱")
private String email;
}
修改
package com.example.demo.business.manual.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("修改用户")
public class UserEditReq {
@ApiModelProperty(value = "用户ID", required = true)
private Long id;
@ApiModelProperty(value = "用户名", required = true)
private String userName;
@ApiModelProperty("昵称")
private String nickName;
@ApiModelProperty("邮箱")
private String email;
}
查询
package com.example.demo.business.manual.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "用户实体", description = "用户description")
public class UserQueryReq {
@ApiModelProperty("用户id")
private Long id;
@ApiModelProperty("用户名")
private String userName;
@ApiModelProperty("昵称")
private String nickName;
@ApiModelProperty("邮箱")
private String email;
@ApiModelProperty("创建时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@ApiModelProperty("修改时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}
DTO
package com.example.demo.business.manual.dto;
import com.example.demo.business.manual.group.ValidGroup;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.time.LocalDateTime;
@Data
public class UserDTO {
/**
* 用户id
*/
@Null(groups = ValidGroup.Add.class, message = "用户id必须为空")
@NotNull(groups = ValidGroup.Edit.class, message = "用户id不能为空")
private Long id;
/**
* 用户名
*/
@NotBlank(groups = {ValidGroup.Add.class, ValidGroup.Edit.class},
message = "用户名不能为空")
private String userName;
/**
* 昵称
*/
private String nickName;
/**
* 邮箱
*/
@NotBlank(message = "邮箱不能为空")
private String email;
/**
* 创建时间
*/
@Null(message = "创建时间必须为空")
private LocalDateTime createTime;
/**
* 修改时间
*/
@NotNull(message = "更新时间不能为空")
private LocalDateTime updateTime;
}
分组
package com.example.demo.business.manual.group;
/**
* 校验的分组
*/
public interface ValidGroup {
interface Add {
}
interface Edit {
}
interface Query {
}
}
测试
访问:http://localhost:8080/doc.html
测试添加
结果:
后端结果: