SpringBoot--manual validation with hibernate validator--method/instance

Original URL: SpringBoot--manual verification with hibernate validator--method/instance

Introduction

illustrate

        This article describes how to use validator for manual validation.

        The validator can perform automatic verification or manual verification. For automatic verification, see "Automatic Verification" below.

automatic verification

        Automatic verification method: In the project, we often add annotations such as @NotNull and @NotBlank to the request class, combined with @Valid or @Validated, to automatically verify the fields. For the usage of automatic verification, see: SpringBoot--parameter verification--@Valid/@Validated--use/example - IT Sharpened Blog - CSDN Blog

rely

Just introduce Spring's Validation.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

It relies on hibernate validator, which is the following

<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>

Tools

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());
        }
    }
}

configuration class

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) {
        // 将数据库数据删除
    }
}

request class

Add to

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;
}

Revise

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;
}

Inquire

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;
}

grouping

package com.example.demo.business.manual.group;

/**
 * 校验的分组
 */
public interface ValidGroup {
    interface Add {
    }

    interface Edit {
    }

    interface Query {
    }
}

test

Visit: http://localhost:8080/doc.html

test add

result:

Backend result:

Guess you like

Origin blog.csdn.net/feiying0canglang/article/details/124282297