SpringBoot-表单验证-统一异常处理-自定义验证信息源

1. 简介我们都知道前台的验证只是为了满足界面的友好性、客户体验性等等 。但是如果仅靠前端进行数据合法性校验,是远远不够的 。因为非法用户可能会直接从客户端获取到请求地址进行非法请求,所以后台的校验是必须的;特别是应用如果不允许输入空值,对数据的合法性有要求的情况下 。
2. 开撸2.1 项目结构

SpringBoot-表单验证-统一异常处理-自定义验证信息源

文章插图
 
结构说明:
├── JAVA│└── com│└── ldx│└── valid│├── ValidApplication.java # 启动类│├── annotation││└── Phone.java # 自定义验证注解│├── config││└── ValidatorConfig.java # 表单验证配置类│├── controller││└── SysUserController.java # 用户管理控制器│├── exception││├── BusinessException.java # 业务异常类││└── GlobalExceptionHandler.java # 统一异常处理类│├── model││├── SysUser.java # 用户信息实体││└── ValidationInterface.java # 表单验证的通用分组接口│├── util││└── CommonResult.java # 接口返回封装类│└── validation│└── PhoneValidator.java #自定义验证实现类└── resources├── application.yaml # 配置文件└── messages└── validation└── messages.properties # 自定义验证信息源2.1 quick start2.1.1 导入依赖创建springboot项目导入以下依赖
<?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.5.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.ldx</groupId><artifactId>valid</artifactId><version>0.0.1-SNAPSHOT</version><name>valid</name><description>表单验证demo</description><properties><java.version>1.8</java.version></properties><dependencies><!-- web支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 表单验证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>2.1.2 添加配置类创建表单验证配置类,配置快速校验,不用等全部的参数校验完,只要有错,马上抛出 。
import org.hibernate.validator.HibernateValidator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;/** * 配置 Hibernate 参数校验 * @author ludangxin * @date 2021/8/5 */@Configurationpublic class ValidatorConfig {@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();//快速校验,只要有错马上返回postProcessor.setValidator(validator());return postProcessor;}@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure().addProperty("hibernate.validator.fail_fast", "true").buildValidatorFactory();return validatorFactory.getValidator();}}2.1.3 添加实体类import lombok.*;import javax.validation.constraints.*;import java.io.Serializable;/** * 用户信息管理 * @author ludangxin * @date 2021/8/5 */@Datapublic class SysUserimplements Serializable {private static final long serialVersionUID = 1L;/*** 主键*/private Long id;/*** 用户名*/@NotEmpty(message = "用户名称不能为空")private String username;/*** 密码*/@Size(min = 6, max = 16, message = "密码长度必须在{min}-{max}之间")private String password = "123456";/*** 邮箱地址*/@Email(message = "邮箱地址不合法")@NotEmpty(message = "邮箱不能为空")private String email;/*** 电话*/@Size(min = 11, max = 11, message = "手机号不合法")@NotEmpty(message = "手机号不能为空")private String phone;}


推荐阅读