1. 自定义注解须知
首先,自定义注解我们必须了解四个元注解,什么是元注解?元注解指作用于注解之上的元数据或者元信息,简单通俗的讲,元注解就是注解的注解 .
Documented与Inherited是典型的标识性注解,也就是说在注解内部并没有成员变量,没有成员变量的注解称为标识注解
Documented
指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API 。
Inherited
指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
Retention
指明在什么级别显示此注解
Retention主要的参数类型包括以下几种:
RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中
Target
指明该类型的注解可以注解的程序元素的范围
Target主要的参数类型包括以下几种:
ElementType.TYPE 用于类,接口,枚举但不能是注解
ElementType.FIELD 作用于字段,包含枚举值
ElementType.METHOD 作用于方法,不包含构造方法
ElementType.PARAMETER 作用于方法的参数
ElementType.CONSTRUCTOR 作用于构造方法
ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
ElementType.ANNOTATION_TYPE 作用于注解
ElementType.PACKAGE 作用于包
2.应用
创建一个注解类(作用于字段)
package com.insert.sql.fruit;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = SipValidator.class)
public @interface Sip {
String message() default "Sip账号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
创建一个校验逻辑的类
package com.insert.sql.fruit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Description 验证Sip账号是否正确
* @ClassName SipValidator
**/
public class SipValidator implements ConstraintValidator<Sip, String> {
private static final Logger logger = LoggerFactory.getLogger(EmailValidator.class);
public void initialize(Sip constraint) {
}
public boolean isValid(String sip, ConstraintValidatorContext context) {
if (sip.equals("")) {
logger.error("Sip账号不能为空");
return false;
}
String reg1 = "sip:\+.*@ims.ge.chinamobile.com";
Pattern pattern = Pattern.compile(reg1);
Matcher matcher = pattern.matcher(sip);
boolean matches = matcher.matches();
return matches;
}
}
创建一个model类(属性上加上我们的自定义注解)
@Sip
private String sip;
此时就可以对该属性进行校验了。
正确如下
错误如下
返回的格式可以再控制器里封装(如下)
@RequestMapping("/age")
public Object getAge(@Valid Apple apple, BindingResult validateResult) {
String s = JSON.toJSONString(apple);
System.out.println(s);
if (validateResult.hasErrors()) {
return new ErrorEntity(-1, validateResult.getAllErrors().get(0).getDefaultMessage());
}
return "requst success!!!";
}
创建一个注解类(作用于类)
使用
参数
结果
大功告成!!!!!!!!!!!!!!