平时开发过程中,常常要用到参数校验,如果间接在代码逻辑外面写参数校验,代码有点冗余且用起来不是十分不便,显得代码逻辑简单且反复代码太多,这里咱们应用注解的形式进行参数校验,SpringBoot 中罕用的用于参数校验的注解如下:
@AssertFalse 所注解的元素必须是 Boolean 类型,且值为 false
@AssertTrue 所注解的元素必须是 Boolean 类型,且值为 true
@DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
@DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
@Digits 所注解的元素必须是数字,且值必须是指定的位数
@Future 所注解的元素必须是未来某个日期
@Max 所注解的元素必须是数字,且值小于等于给定的值
@Min 所注解的元素必须是数字,且值小于等于给定的值
@Range 所注解的元素需在指定范畴区间内
@NotNull 所注解的元素值不能为 null
@NotBlank 所注解的元素值有内容
@Null 所注解的元素值为 null
@Past 所注解的元素必须是某个过来的日期
@PastOrPresent 所注解的元素必须是过来某个或当初日期
@Pattern 所注解的元素必须满足给定的正则表达式
@Size 所注解的元素必须是 String、汇合或数组,且长度大小需保障在给定范畴之内
@Email 所注解的元素需满足 Email 格局
1、在 GitEgg-Platform 工程的子工程 gitegg-platform-boot 里增加 spring-boot-starter-validation 依赖,因为自 SpringBoot2.3.X 开始 spring-boot-starter-web 默认不再引入校验框架,这里须要手动引入,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>GitEgg-Platform</artifactId>
<groupId>com.gitegg.platform</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gitegg-platform-boot</artifactId>
<name>${project.artifactId}</name>
<version>${project.parent.version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.gitegg.platform</groupId>
<artifactId>gitegg-platform-swagger</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2、GitEgg-Platform 工程从新 install,在 GitEgg-Cloud 工程的子工程 gitegg-service-system 外面新建类 SystemDTO.java
package com.gitegg.service.system.dto;
import lombok.Data;
import javax.validation.constraints.*;
@Data
public class SystemDTO {
@NotNull
@Min(value = 10, message = "id 必须大于 10")
@Max(value = 150, message = "id 必须小于 150")
private Long id;
@NotNull(message = "名称不能为空")
@Size(min = 3, max = 20, message = "名称长度必须在 3 -20 之间")
private String name;
}
3、SystemController.java 类外面增加参数校验测试接口
package com.gitegg.service.system.controller;
import com.gitegg.platform.boot.common.base.Result;
import com.gitegg.platform.boot.common.exception.BusinessException;
import com.gitegg.service.system.dto.SystemDTO;
import com.gitegg.service.system.service.ISystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping(value = "system")
@AllArgsConstructor
@Api(tags = "gitegg-system")
public class SystemController {
private final ISystemService systemService;
@GetMapping(value = "list")
@ApiOperation(value = "system list 接口")
public Object list() {return systemService.list();
}
@GetMapping(value = "page")
@ApiOperation(value = "system page 接口")
public Object page() {return systemService.page();
}
@GetMapping(value = "exception")
@ApiOperation(value = "自定义异样及返回测试接口")
public Result<String> exception() {return Result.data(systemService.exception());
}
@PostMapping(value = "valid")
@ApiOperation(value = "参数校验测试接口")
public Result<SystemDTO> valid(@Valid @RequestBody SystemDTO systemDTO) {return Result.data(systemDTO);
}
}
4、运行 GitEggSystemApplication.java,关上浏览器拜访:http://127.0.0.1:8001/doc.html,而后点击左侧的参数校验测试接口,应用 Swagger2 进行测试,即可查看校验后果
5、这里的提示信息用到了上一章节讲到的对立异样解决逻辑:
/**
* 非法申请 - 参数校验
*/
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException methodArgumentNotValidException) {
// 获取异样字段及对应的异样信息
StringBuffer stringBuffer = new StringBuffer();
methodArgumentNotValidException.getBindingResult().getFieldErrors().stream()
.map(t -> t.getField() + t.getDefaultMessage() + ";")
.forEach(e -> stringBuffer.append(e));
String errorMessage = stringBuffer.toString();
Result result = Result.error(ResultCodeEnum.PARAM_VALID_ERROR, errorSystem + errorMessage);
return result;
}
本文源码在 https://gitee.com/wmz1930/GitEgg 的 chapter-08 分支。