SpringBoot--用hibernate validator手动校验--方法/实例

原文网址: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

测试添加

结果:

后端结果:

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/124282297