素材巴巴 > 程序开发 >

spring boot项目如何自定义参数校验规则

程序开发 2023-09-03 12:40:20

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[] payload() default {};}

然后定义实现具体校验规则的类,这个类要实现ConstraintValidator接口。

public class MobileNoValidator implements ConstraintValidator {@Overridepublic 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 {@NotNullprivate Long id;@NotNull@MobileNoprivate 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错误码,错误信息如下。当然这里返回的错误信息比较不友好,实际项目中可以对参数校验异常统一拦截,返回需要的数据格式。


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。