Java开发中自定义校验注解

       在日常的开发中可能会对手机号、邮箱、身份证号的合法性进行校验,然而每次使用if语句调用校验函数进行校验又显得过于麻烦,这时候自定义校验注解用处就很大了。

1、需要的依赖



   javax.validation
   validation-api
   2.0.1.Final
 

2、自定义校验注解

      在自定义注解之前先来了解一下注解的基础知识:

      元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。

      注解的保留策略:

        @Retention(RetentionPolicy.SOURCE)   // 注解仅存在于源码中,在class字节码文件中不包含

        @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

        @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

       注解的作用目标:

       @Target(ElementType.TYPE)                      // 接口、类、枚举、注解

       @Target(ElementType.FIELD)                     // 字段、枚举的常量

       @Target(ElementType.METHOD)                 // 方法

       @Target(ElementType.PARAMETER)            // 方法参数

       @Target(ElementType.CONSTRUCTOR)       // 构造函数

       @Target(ElementType.LOCAL_VARIABLE)   // 局部变量

       @Target(ElementType.ANNOTATION_TYPE) // 注解

       @Target(ElementType.PACKAGE)               // 包

    (1)创建注解类并对注解记性赋值


import com.example.demo.validator.IdNumValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.FIELD})  //作用于字段,枚举上
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdNumValidator.class) //校验的逻辑处理类
public @interface IdNum {

    String message() default "身份证号码不正确";   //提示的信息

    Class[] groups() default { };  //分组验证,例如只在新增时进行校验等

    Class[] payload() default { };
}

   (2)处理校验逻辑

import com.example.demo.validator.annotation.IdNum;
import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @ClassName IdNumValidator
 * @Description 身份证校验  
 * 通过实现ConstraintValidator,来实现自定义校验逻辑
 * @Author LIUYH
 * @DateTime 2019/3/28 14:22
 **/
public class IdNumValidator implements ConstraintValidator {

    @Override
    public void initialize(IdNum myConstraint) {
        /* 初始化数据,如果有需要初始化的在此操作,没有则不需操作次函数 */
    }

    /**
     * @Description: 自定义校验逻辑
     */
    @Override
    public boolean isValid(String idNum, ConstraintValidatorContext constraintValidatorContext) {
         /*  逻辑代码,不符合返回false,否则返回true */
    }
}

  (3)使用自定义注解

   ① 在所需要校验的字段上使用注解

import com.example.demo.validator.annotation.IdNum;
import lombok.Data;

/**
 * @ClassName TestEntity
 * @Description TODO
 * @Author LIUYH
 * @DateTime 2019/3/28 17:25
 **/
@Data
public class TestEntity {

    private String id;

    private String name;

    @IdNum
    private String idNum;
}

  ②在controller层使用@Validated进行校验

@RestController
public class TestController {

    @PostMapping("/test")
    public String test(@Validated @RequestBody TestEntity req){
        System.out.printf(req.getIdNum());
        return "success";
    }
}

(4)测试(本例校验身份证号是否合法)

Java开发中自定义校验注解_第1张图片

你可能感兴趣的:(Java开发,Java框架开发,Java,注解,自定义注解)