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

  • 合法参数请求
  • 非法参数请求
相关推荐
Tim_1018 分钟前
【C++】009、extern关键字
java·开发语言
ShiXZ21321 分钟前
PDF-OCR文件识别篇(七):数据入库
java·pdf·json·ocr·springboot
rebibabo1 小时前
Java基础(番外) | Kafka 入门:分区、副本与消费者组原理
java·分布式·kafka·学习笔记·副本·分区·异步日志
Flittly1 小时前
【AgentScope Java新手村系列】(17)长期记忆系统
java·spring boot·spring
fliter1 小时前
Futures Nostalgia:从 hyper 老派写法看懂 async Rust、Tower 与 Backpressure
后端
wei1986211 小时前
.net添加web引用和添加服务引用有什么区别?
java·前端·.net
Full Stack Developme1 小时前
正则表达式的使用教程
java·数据库·正则表达式
SeeYa-J2 小时前
Sprint 1-2:创建第一个 Spring Boot Module(user-service)
java·spring boot·sprint