@Constraint自定义参数校验注解

前言

我们一般在项目中做参数校验都是使用@Vaild注解进行参数校验,但是官方提供的注解并不能全部满足我们的需求,所以就需要自定义注解对参数进行检验。下面就是使用@Constraint这个注解

 

一、需求

比如:我们对某个传入的参数要求只能是中文,不能是英文。

二、代码实现

1.自定义注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解-只匹配中文
 */
@Target({ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {

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

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

    String message() default "校验参数通不过";
}

2.自定义注解校验类

需要实现ConstraintValidator接口,第一个参数为自定义注解类,第二个参数为要校验的参数类型

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 自定义注解校验类
 */
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {

    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        String pattern = "^[\\u4e00-\\u9fa5]{0,}$";
        Pattern p = Pattern.compile(pattern);
        Matcher matcher = p.matcher(value);
        while (matcher.find()) {
            return true;
        }
        return false;
    }
}

3.进行验证

3.1、定义实体类

import com.lbl.annotation.MyConstraint;
import lombok.Data;

import javax.validation.constraints.Email;

@Data
public class Student {

    @MyConstraint(message = "name字段只能为中文")
    private String name;

    private String address;

    @Email
    private String email;

    private String content;
}

3.2、全局异常处理

import com.lbl.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * 全局异常处理
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String msg = null;
        if (bindingResult.hasErrors()) {
            List<ObjectError> errorList = e.getAllErrors();
            msg = errorList.get(0).getDefaultMessage();
            log.error("参数校验异常:{}", msg);
        }
        return Result.error(msg);
    }

}

3.3、controller测试

package com.lbl.controller;

import com.lbl.pojo.Student;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RequestMapping("/stu")
@RestController
public class StudentController {

    @PostMapping("/test")
    public String test(@RequestBody @Valid Student student) {
        return "Hello " + student.getName();
    }
}

3.4、postmant验证

输入非中文时

image

 https://blog.csdn.net/LBL_lin/article/details/129283418

posted @ 2025-12-24 11:46  wq9  阅读(7)  评论(0)    收藏  举报