Spring Boot中参数验证(@Valid)
1 概述
Spring Boot中使用@Valid实现参数验证。
2 工程布局
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>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<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>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3 源代码
3.1 ValidParamConfig
package com.example.test.config;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestControllerAdvice
public class ValidParamConfig {
// 捕获方法中参数异常
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public WebResult<List<Map<String, String>>> invalidParameterExceptionHandler(MethodArgumentNotValidException exception){
// 获取错误信息
List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
// 设置默认返回值
WebResult<List<Map<String, String>>> data = new WebResult<>();
data.setMsg("The parameter is invalid ");
data.setCode(-1);
// 重构参数
ArrayList<Map<String, String>> errorList = new ArrayList<>();
fieldErrors.forEach(error ->{
HashMap<String, String> temp = new HashMap<>();
temp.put("Attr", error.getField());
temp.put("Msg", error.getDefaultMessage());
errorList.add(temp);
});
data.setData(errorList);
return data;
}
}
3.2 WebResult
package com.example.test.config;
/**
* 自定义统一返回值
* @param <T> 自定义参数
*/
public class WebResult<T> {
private int code;
private String msg;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
3.3 TestController
package com.example.test.controller;
import com.example.test.entity.TestParam;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/query")
public String queryData(@RequestBody @Valid TestParam testParam){
return "I am mason";
}
}
3.4 TestParam
package com.example.test.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestParam {
@Min(value = 1, message = "值不能小于1")
private int num;
@NotEmpty(message = "信息不能为空")
private String msg;
}
3.5 StatusCode
package com.example.test.util;
/**
* 设置状态码
*/
public enum StatusCode {
PARAM_ERROR(1, "Success");
private int code;
private String msg;
/**
* 设置状态码
* @param code 状态码
* @param msg 状态消息
*/
StatusCode(int code, String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
application.yml文件和Application.java文件无变化