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

  • 合法参数请求
  • 非法参数请求
相关推荐
FG.2 分钟前
Day22
java·面试
小猪乔治爱打球3 分钟前
[Golang修仙之路] 算法专题:回溯(递归)
后端·面试
菜鸟的迷茫4 分钟前
Redis 缓存雪崩、穿透、击穿面试题深度解析与 Spring Boot 实战代码示例
java
昵称为空C11 分钟前
SpringBoot数据存储时区选择,符合国际化和特定时区方案
spring boot·后端
珹洺15 分钟前
C++算法竞赛篇:DevC++ 如何进行debug调试
java·c++·算法
remCoding15 分钟前
Java全栈面试实录:从电商场景到AIGC的深度技术考察
spring boot·redis·spring cloud·ai·kafka·aigc·java面试
SHUIPING_YANG22 分钟前
根据用户id自动切换表查询
java·服务器·数据库
爱吃烤鸡翅的酸菜鱼35 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
惊涛骇浪、40 分钟前
SpringMVC + Tomcat10
java·tomcat·springmvc
墨染点香1 小时前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode