spring boot项目对参数进行校验时,比如非空校验,可以直接用validation包里面自带的注解。但是对于一些复杂的参数校验,自带的校验规则无法满足要求,此时需要我们自定义参数校验规则。自定义校验规则和自带的规则实现方式一样,先自定义一个注解,然后指定校验类,在校验类里实现具体的校验规则。
下面以校验手机号为例,来实现自定义参数校验规则。
首先定义一个注解,直接照着NotNull注解定义即可。
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//这里的class就是实现具体校验规则的类
@Constraint(validatedBy = {MobileNoValidator.class})
public @interface MobileNo {
String message() default "请输入正确的手机号";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
然后定义实现具体校验规则的类,这个类要实现ConstraintValidator接口。
public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if ((value == null)) {
return false;
}
String regex = "^1\\d{10}$";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(value);
return m.matches();
}
}
这样,很简单的两个类,就实现了自定义参数校验规则。当参数中加了MobileNo注解,如果输入的手机号不满足1打头的11位数字的规则,就会抛出异常信息。下面写个controller简单测试一下。
先定义一个vo。
public class UserVo {
@NotNull
private Long id;
@NotNull
@MobileNo
private String mobileNo;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
}
再定一个controller。
@RestController
public class UserController {
@PostMapping(value = "/test")
public String test(@Validated @RequestBody UserVo userVo) {
return "success";
}
}
启动项目,用postman测试一下。
首先输入符合要求的手机号,这时是能正常返回success。
然后输入一个不符合要求的手机号,会返回400错误码,错误信息如下。当然这里返回的错误信息比较不友好,实际项目中可以对参数校验异常统一拦截,返回需要的数据格式。