SpringBoot 使用自定义注解和枚举类对接口入参校验

目录

  • [1. jar包导入](#1. jar包导入)
  • [2. 自定义注解](#2. 自定义注解)
  • [3. 校验类](#3. 校验类)
  • [4. 定义枚举类](#4. 定义枚举类)
  • [5. 被校验的实体类](#5. 被校验的实体类)
  • [6. 全局异常拦截](#6. 全局异常拦截)
  • [7. controller](#7. controller)
  • [8. 测试](#8. 测试)

1. jar包导入

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2. 自定义注解

java 复制代码
package com.example.server.annotation;

import com.example.server.valid.EnumValidator;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = EnumValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface RegexValidation {

    Class<? extends Enum<?>> value();

    String message() default "Invalid input format";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

3. 校验类

java 复制代码
package com.example.server.valid;

import com.example.server.annotation.RegexValidation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;


public class EnumValidator implements ConstraintValidator<RegexValidation, String> {

    private Class<? extends Enum<?>> enumClass;

    @Override
    public void initialize(RegexValidation constraintAnnotation) {
        this.enumClass = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) {
            return true;
        }
        for (Enum<?> e : enumClass.getEnumConstants()) {
            if (e.name().equals(value)) {
                return true;
            }
        }
        return false;
    }

}

4. 定义枚举类

java 复制代码
package com.example.server.enums;

public enum GenderRegex {

    MALE, FEMALE, OTHER;

}

5. 被校验的实体类

java 复制代码
package com.example.server.entity;

import com.example.server.annotation.RegexValidation;
import com.example.server.enums.GenderRegex;
import lombok.Data;

@Data
public class User {

    private String name;

    private Integer age;

    @RegexValidation(value = GenderRegex.class, message = "输入的性别不符合要求,请重新输入")
    private String gender;

}

6. 全局异常拦截

java 复制代码
package com.example.server.advice;

import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ControllerExceptionAdvice {
    /**
     * 参数错误异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        return e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
    }

    @ExceptionHandler(Exception.class)
    public String exceptionHandler(Exception e) {
        return e.getMessage();
    }

}

7. controller

java 复制代码
package com.example.server.controller;

import com.example.server.entity.User;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServerController {

    @PostMapping("/hello")
    public User hello(@RequestBody @Valid User user) {
        return user;
    }

}

8. 测试

  • 合法参数请求
  • 非法参数请求
相关推荐
CoderYanger17 分钟前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
C++业余爱好者21 分钟前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
想用offer打牌22 分钟前
RocketMQ如何防止消息丢失?
java·后端·架构·开源·rocketmq
皮卡龙25 分钟前
Java常用的JSON
java·开发语言·spring boot·json
利刃大大1 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七1 小时前
Java反射:万能遥控器拆解编程
java·开发语言
han_hanker1 小时前
java 异常类——详解
java·开发语言
源码获取_wx:Fegn08951 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring
峥嵘life2 小时前
Android16 EDLA 认证测试CTS问题分析解决
android·java·服务器
Mr1ght2 小时前
为什么 InheritableThreadLocal 在 Spring 线程池中“偶尔”能传递变量?——一次线程池上下文传播的误解
java·spring