• Springboot--元注解及自定义注解(表单验证)


      本文简单说明一下元注解,然后对元注解中的@Retention做深入的讨论,在文章最后使用元注解写一个自定义注解来结尾。

    一、结论:

    @Target:注解的作用目标

      @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)——包

    @Retention:注解的保留位置

      RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
      RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
      RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
    @Document:说明该注解将被包含在javadoc中
    @Inherited:说明子类可以继承父类中的该注解

    二、场景与样例

      此处对@Retention做特殊说明。

      RetentionPolicy.SOURCE,编译后的class文件不包含@Retention注释,使用在编译阶段,主要是在编译时做一些操作,例如:@Override和@SuppressWarnings(@Override:改注解向编译器说明被注解元素是重写的父类的一个元素。在重写父类元素的时候此注解并非强制性的,不过可以在重写错误时帮助编译器产生错误以提醒我们。比如子类方法的参数和父类不匹配,或返回值类型不同;编译通过后,方法上不再有@Override注解;@SuppressWarnings:在编译时抑制编译报错)。

      RetentionPolicy.CLASS,编译后在class文件中仍然存在,但是运行时不会被JVM调用,即使是使用反射也不无法调用该注解,但是要是具体说他与RetentionPolicy.SOURCE的区别,除了是否会存在于class文件上之外,还没有找到实质性的区别(很有可能的区别是:RetentionPolicy.SOURCE仅仅是给应用层开发人员用的,RetentionPolicy.CLASS 需要应用层和底层系统开发人员配合使用的,所以仅仅是应用层开发的我们是一脸懵逼)

    三、自定义注解(以自定义日期校验注解为例)

      1、自定义注解

    package com.example.demo.utils;
    
    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,ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = DateTimeValidator.class)
    public @interface DateTime {
        String message() default "格式错误";
        String format() default "YYYY-MM-DD";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    
    }

      其中@Constraint必须添加,改注解指定自定义注解的具体实现类。

      2、自定义注解实现类(校验逻辑实现类)

    package com.example.demo.utils;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    
    public class DateTimeValidator implements ConstraintValidator<DateTime, String> {
    
        private DateTime dateTime;
    
        @Override
        public void initialize(DateTime constraintAnnotation) {
            this.dateTime = constraintAnnotation;
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if(context == null){
                return true;
    
            }
            String format = dateTime.format();
            if (value.length() != format.length()) {
                return false;
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
            try {
                simpleDateFormat.parse(value);
            } catch (ParseException e) {
                return false;
            }
            return true;
        }
    }

      3、自定义注解使用

    @Validated
    @Controller
    @RequestMapping("/test")
    @Api(value = "SpringBoot测试接口2")
    public class UserTestController2 {
    
        @ResponseBody
        @PostMapping(value ="/validated2")
        @ApiOperation(value="validated表单验证测试")
        @ApiImplicitParams( {@ApiImplicitParam(paramType="query", name = "date", value = "日期", dataType = "String")})
        public String validated2(@DateTime(message = "格式错误啦啦啦啦",format = "yyyy-mm-dd") String date){
            return "OK";
        }
    
    
        @ResponseBody
        @PostMapping(value ="/validated3")
        @ApiOperation(value="validated表单验证测试")
        @ApiImplicitParams( {@ApiImplicitParam(paramType="query", name = "date", value = "日期", dataType = "String")})
        public String validated3(@DateTime String date){
            return "OK";
        }
    }

      4、验证

  • 相关阅读:
    Explainable ML
    Fizz Buzz in tensorflow
    Tips for traing DNN (Adam,正则化,Dropout)
    深度学习 高数知识
    perror strerror使用方法
    posix信号量与互斥锁
    线程基本操作(一)
    system v共享内存与信号量综合
    shell统计当前文件夹下的文件个数、目录个数
    栈 c实现
  • 原文地址:https://www.cnblogs.com/liconglong/p/11491973.html
Copyright © 2020-2023  润新知