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

  • 合法参数请求
  • 非法参数请求
相关推荐
supingemail6 分钟前
面试之 Java 新特性 一览表
java·面试·职场和发展
星星点点洲13 分钟前
【Java】应对高并发的思路
java
LDM>W<15 分钟前
黑马点评-用户登录
java·redis
保利九里21 分钟前
数据类型转换
java·开发语言
Uranus^25 分钟前
使用Spring Boot与Spring Security构建安全的RESTful API
java·spring boot·spring security·jwt·restful api
蚂蚁在飞-26 分钟前
Golang基础知识—cond
开发语言·后端·golang
Aiden Targaryen26 分钟前
Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置
java·uni-app·webstorm
啾啾Fun36 分钟前
【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现
java·分布式·微服务
神经毒素1 小时前
WEB安全--Java安全--shiro550反序列化漏洞
java·安全·web安全·shiro
Coding宇航员1 小时前
玩转 AI · 思考过程可视化
spring boot·ai·可视化