diff --git a/springboot-validator/pom.xml b/springboot-validator/pom.xml
new file mode 100644
index 0000000..7e08ba2
--- /dev/null
+++ b/springboot-validator/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.2.RELEASE
+
+
+ top.lrshuai
+ springboot-validator
+ 0.0.1-SNAPSHOT
+ springboot-validator
+ 自定义注解校验参数
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/SpringbootValidatorApplication.java b/springboot-validator/src/main/java/top/lrshuai/validator/SpringbootValidatorApplication.java
new file mode 100644
index 0000000..59a86a9
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/SpringbootValidatorApplication.java
@@ -0,0 +1,13 @@
+package top.lrshuai.validator;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringbootValidatorApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringbootValidatorApplication.class, args);
+ }
+
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValidator.java b/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValidator.java
new file mode 100644
index 0000000..f28e415
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValidator.java
@@ -0,0 +1,64 @@
+package top.lrshuai.validator.annotation;
+
+import org.springframework.util.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 自定义验证器
+ */
+public class MatchValidator implements ConstraintValidator {
+
+ /**
+ * 接收注解传过来的值
+ */
+ private Set enumName=new HashSet<>();
+
+ /**
+ * 初始化方法,可以获取注解的参数信息
+ */
+ @Override
+ public void initialize(MatchValue matchValue) {
+ try {
+ String[] values = matchValue.values();
+ if(values.length>0){
+ for (String item:values){
+ enumName.add(item);
+ }
+ }
+ Class[] enums = matchValue.enums();
+ if(enums.length>0){
+ Enum[] enumConstants = Arrays.stream(enums).findFirst().get().getEnumConstants();
+ for (Enum e:enumConstants){
+ enumName.add(e.name());
+ }
+ }
+ }catch (Throwable e){
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * 校验值
+ * @param value 参数的值信息
+ * @param context 上下文对象,可以禁用默认提示模板,然后更改提示模板
+ * @return boolean
+ */
+ @Override
+ public boolean isValid(String value, ConstraintValidatorContext context) {
+ if(!StringUtils.isEmpty(value)){
+ for(String name:enumName){
+ if(name.equals(value)){
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValue.java b/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValue.java
new file mode 100644
index 0000000..a1088b8
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/annotation/MatchValue.java
@@ -0,0 +1,36 @@
+package top.lrshuai.validator.annotation;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+/**
+ * 自定义注解
+ */
+@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+// 指定此注解的实现,即:验证器
+@Constraint(validatedBy = MatchValidator.class)
+public @interface MatchValue {
+
+ /**
+ * 固定的值校验
+ */
+ String[] values() default {};
+
+ /**
+ * 校验不通过提示
+ */
+ String message() default "";
+
+ /**
+ * 通过枚举类校验
+ */
+ Class extends Enum>[] enums() default {};
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/commons/Result.java b/springboot-validator/src/main/java/top/lrshuai/validator/commons/Result.java
new file mode 100644
index 0000000..08b1904
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/commons/Result.java
@@ -0,0 +1,88 @@
+package top.lrshuai.validator.commons;
+
+import org.springframework.util.ObjectUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 随便封装了下接口返回 模板类
+ */
+public class Result extends HashMap {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 状态
+ */
+ public static final String STATUS="status";
+ /**
+ * 信息
+ */
+ public static final String MESSAGE="message";
+ /**
+ * 数据体
+ */
+ public static final String DATA="data";
+
+ public Result() {
+ put(STATUS, 200);
+ put(MESSAGE, "ok");
+ }
+
+ public static Result error() {
+ return error("500", "系统错误,请联系管理员");
+ }
+
+ public static Result error(String msg) {
+ return error("500", msg);
+ }
+
+ public static Result error(String status, String msg) {
+ Result r = new Result();
+ r.put(STATUS, status);
+ r.put(MESSAGE, msg);
+ return r;
+ }
+
+ public static Result ok(Map map) {
+ Result r = new Result();
+ r.putAll(map);
+ return r;
+ }
+ public static Result ok(Object data) {
+ Result r = new Result();
+ r.put(DATA,data);
+ return r;
+ }
+
+ public static Result ok() {
+ return new Result();
+ }
+
+ @Override
+ public Result put(String key, Object value) {
+ super.put(key, value);
+ return this;
+ }
+
+ public Result putData(String key, Object value) {
+ Object data = getData();
+ if(ObjectUtils.isEmpty(data)){
+ data=new HashMap();
+ this.put(DATA,data);
+ }
+ if(data instanceof HashMap){
+ ((HashMap) data).put(key,value);
+ }else {
+ throw new RuntimeException("不是map类型,无法添加其他属性");
+ }
+ return this;
+ }
+
+ public Object getData(){
+ return this.get(DATA);
+ }
+
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/controller/TestController.java b/springboot-validator/src/main/java/top/lrshuai/validator/controller/TestController.java
new file mode 100644
index 0000000..9b0b71d
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/controller/TestController.java
@@ -0,0 +1,20 @@
+package top.lrshuai.validator.controller;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import top.lrshuai.validator.dto.TestDto;
+
+import javax.validation.Valid;
+
+@Validated
+@RestController
+public class TestController {
+
+ @PostMapping("/test")
+ public Object test(@RequestBody @Valid TestDto dto){
+ System.out.println("dto="+dto.toString());
+ return "ok";
+ }
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/dto/TestDto.java b/springboot-validator/src/main/java/top/lrshuai/validator/dto/TestDto.java
new file mode 100644
index 0000000..fa75654
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/dto/TestDto.java
@@ -0,0 +1,27 @@
+package top.lrshuai.validator.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import top.lrshuai.validator.annotation.MatchValue;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+
+@Data
+@Accessors(chain = true)
+public class TestDto {
+
+ @NotBlank(message = "name不能为空")
+ private String name;
+
+ @MatchValue(values = {"男","女"},message = "sex参数无效")
+ private String sex;
+
+ @NotNull(message = "age 不能为空")
+ @Min(value = 1,message = "age最小是1")
+ @Max(value = 200,message = "age最大为200")
+ private Integer age;
+}
diff --git a/springboot-validator/src/main/java/top/lrshuai/validator/exception/GlobalExceptionHandlerAdvice.java b/springboot-validator/src/main/java/top/lrshuai/validator/exception/GlobalExceptionHandlerAdvice.java
new file mode 100644
index 0000000..efd1807
--- /dev/null
+++ b/springboot-validator/src/main/java/top/lrshuai/validator/exception/GlobalExceptionHandlerAdvice.java
@@ -0,0 +1,52 @@
+package top.lrshuai.validator.exception;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import top.lrshuai.validator.commons.Result;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolationException;
+import javax.xml.bind.ValidationException;
+
+/**
+ * 描述:全局统一异常处理
+
+ */
+@Slf4j
+@ControllerAdvice
+public class GlobalExceptionHandlerAdvice {
+
+ /**
+ * 验证异常
+ */
+ @ExceptionHandler(value = {MethodArgumentNotValidException.class})
+ @ResponseBody
+ public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+ BindingResult bindingResult = e.getBindingResult();
+ String errorMsg = "";
+ for (FieldError fieldError : bindingResult.getFieldErrors()) {
+ errorMsg += fieldError.getDefaultMessage() + ";";
+ }
+ if (!StringUtils.isEmpty(errorMsg)) {
+ log.error("MethodArgumentNotValidException:" + errorMsg);
+ return Result.error(errorMsg);
+ }
+ return Result.error();
+ }
+
+ @ExceptionHandler(Exception.class)
+ @ResponseBody
+ public Result handlerException(Exception e) {
+ log.error("系统异常:" + e.getMessage(), e);
+ return Result.error();
+ }
+
+}
diff --git a/springboot-validator/src/main/resources/application.yml b/springboot-validator/src/main/resources/application.yml
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/springboot-validator/src/main/resources/application.yml
@@ -0,0 +1 @@
+
diff --git a/springboot-validator/src/test/java/top/lrshuai/validator/SpringbootValidatorApplicationTests.java b/springboot-validator/src/test/java/top/lrshuai/validator/SpringbootValidatorApplicationTests.java
new file mode 100644
index 0000000..350b75b
--- /dev/null
+++ b/springboot-validator/src/test/java/top/lrshuai/validator/SpringbootValidatorApplicationTests.java
@@ -0,0 +1,13 @@
+package top.lrshuai.validator;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SpringbootValidatorApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}