今天博主来以一个简单的例子来讲解一下:通过JSR303来创建自定义的验证(SpringBoot+Mybatis环境)
1.我们创建一个名为LoginVo的JavaBean,从下面可以看出创建的自定的验证为@IsMobile
package com.imooc.miaosha.vo;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import com.imooc.miaosha.valiadator.IsMobile;
public class LoginVo {
//用户登录的pojo
//使用SpringBoot的注解来限制变量的格式
@NotNull
@IsMobile //自定义注解 检查mobile格式是否正确
private String mobile;
@NotNull //不为空
@Length(min=32) //最小的长度为32位
private String password;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//再生成其toString()方法
@Override
public String toString() {
return "LoginVo [mobile=" + mobile + ", password=" + password + "]";
}
}
2.接下来我们要对新创建的注解写一个同名的类了:
package com.imooc.miaosha.valiadator;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
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.RetentionPolicy.RUNTIME;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValiadator.class})
public @interface IsMobile {
//true:参数必须有,进行格式校验 false:参数可以为空,不为空时也要进行进行格式校验
boolean requried() default true; //这个可有可无
//提示信息
String message() default "手机号码格式错误";//通过注解后输出的信息,可以自定义
Class<?>[] groups() default{};
Class<?extends Payload>[] payload() default{};
}
3.创建完IsMobile类,我们可以从IsMobile类中发现代码
@Constraint(validatedBy = {IsMobileValiadator.class})
其中有个
IsMobileValiadator.class
这个类才是注解的真正的实现类(处理类):
对于这个类具体怎么处理得看你想要这个注解干什么活了,但需要注意的是:
这个类必须实现ConstraintValidtor接口,其中的两个参数在下面的代码已经给出相关解释了
package com.imooc.miaosha.valiadator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.alibaba.druid.util.StringUtils;
import com.imooc.miaosha.util.ValiadatorUtils;
public class IsMobileValiadator implements ConstraintValidator<IsMobile, String> {
/**注意的是:ConstraintValidator<IsMobile, String>
* 第一个参数就是自定义注解的名字 第二个就是注解修饰的字段类型
*/
//申明一个required 默认的值为false
public boolean required = false;
public void initialize(IsMobile constraintAnnotation) {
//初始化:拿到IsMobile中的required中的值
required = constraintAnnotation.requried();
}
public boolean isValid(String value, ConstraintValidatorContext context) {
//判断value是否必须 required为true则为必须 反之不是必须的
if(required)
{
//必须的
return ValiadatorUtils.isMoible(value);
}
else
{
//判断值是否为空
if(StringUtils.isEmpty(value))
{
//为空的时候返回true
return true;
}
//否则进行格式校验
return ValiadatorUtils.isMoible(value);
}
}
}
好了,创建一个简单的JSR303注解就完成了,三步就搞定了!