在上一篇博客中,博主介绍了使用自带注解完成参数校验的过程,现在我们要自定义一个注解。这篇博客是在上一篇的基础上写的,如果有清楚怎么使用注解进行校验,可以查看上一篇博客。
现在我们来做一个手机号的校验,话不多说直接上代码。
1.创建一个注解类
package com.youyou.learn.validation;
import com.youyou.learn.validation.Impl.Phone;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
@Constraint(validatedBy = Phone.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PhoneRegex {
String message() default "手机号码不正确";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
2.创建一个校验实现类
package com.youyou.learn.validation.Impl;
import com.youyou.learn.validation.PhoneRegex;
import com.youyou.util.utils.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Phone implements ConstraintValidator<PhoneRegex,String> {
@Override
public void initialize(PhoneRegex constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// String regex="^[1](([3|5|8][\\d])|([4][5,6,7,8,9])|([6][5,6])|([7][3,4,5,6,7,8])|([9][8,9]))[\\d]{8}$";
String regex="^[1][\\d]{10}$";
if(StringUtils.isNotEmpty(value)){
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(value);
return m.matches();
}
return false;
}
}
OK!搞定了!
来测试一下!
3.测试VO
package com.youyou.learn.vo;
import com.youyou.learn.validation.PhoneRegex;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
public class UserVO {
@NotNull(message = "名字不能为空")
private String name ;
@Min(value = 18, message = "年龄必须大于18")
private Integer age;
@PhoneRegex()
private String phone;
}
4.controller类
package com.youyou.learn.controller;
import com.youyou.learn.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/validated")
@Api(description = "测试校验")
public class TestValidatedController {
@ApiOperation(value = "test1")
@GetMapping(value = "/test1" )
public void test(@Validated UserVO userVO){
}
}
测试效果如下: