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. 测试

  • 合法参数请求
  • 非法参数请求
相关推荐
Maiko Star11 小时前
Spring AI ChatClient 完全指南:从基础配置到流式调用
java·人工智能·spring
l1t11 小时前
类似 X-13ARIMA-SEATS 功能的 JDemetra+ 安装和使用
java·数据库·r语言
架构源启11 小时前
2026 进阶篇:深入理解Spring Reactor响应式编程的核心引擎(源码级解析+实战避坑)
java·后端·spring
用户9623779544811 小时前
Ghost Bits:高位截断如何让 Java WAF 形同虚设
后端
薪火铺子11 小时前
SpringMVC请求处理流程源码解析(第2篇):处理器执行与参数绑定
java·后端·spring
SamDeepThinking11 小时前
一个跑了三年没出过问题的系统,我是怎么设计的
java·后端·架构
写了20年代码的老程序员11 小时前
做接口开发最烦的,不是 JSON 深,而是它打断你思考业务
后端
逸Y 仙X11 小时前
文章十七:ElasticSearch get\search查询相关参数
java·大数据·elasticsearch·搜索引擎·全文检索
Walter先生11 小时前
Python 行情数据清洗实战:Z-Score、MAD 与分位数过滤的异常值检测
后端·websocket·架构·实时行情数据源·美股行情api
Cache技术分享11 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
前端·后端