前言
我们一般在项目中做参数校验都是使用@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验证
输入非中文时