@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验证
输入非中文时

个人学习笔记,记录日常学习,便于查阅及加深,仅为方便个人使用。

浙公网安备 33010602011771号