美文网首页
自定义注解

自定义注解

作者: 刻骨铭心_17d7 | 来源:发表于2019-10-25 11:16 被阅读0次

    在业务开发时使用注解能大量节省我们的开发时间,使代码更简洁,用户只需关注业务逻辑,但有些注解并不能满足我们的需求,所以需要自己定义,以下定义验证的注解

    1.建立注解类

    image.png

    2.构建注解类

    @Target({ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = MyContraintValidator.class)
    public @interface MyContraint {
        String message();
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    

    1.@Target:权限使用区域

    ElementType.TYPE:说明该注解只能被声明在一个类前。
    ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
    ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
    ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
    ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
    ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
    ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
    ElementType.PACKAGE:说明该注解只能声明在一个包名前

    2.Retention:注解生命周期

    RetentionPolicy.SOURCE: 注解只保留在源文件中
    RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
    RetentionPolicy.RUNTIME: 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。

    3.@Constraint:validatedBy实现该注解逻辑的类

    public class MyContraintValidator implements ConstraintValidator<MyContraint,Object> {
    
        @Autowired
        private HelloService helloService;
        @Override
        public void initialize(MyContraint constraintAnnotation) {
            System.out.println("my validator init");
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
            System.out.println(helloService.greeting("tom"));
            System.out.println(value);
            return false;
        }
    }
    

    1.实现ConstraintValidator<T,E>接口,T:要实现的注解类,E:要注解的元素类型

    2.方法体内能使用@Autowired注入其他类逻辑

    3.在运行的时执行一次initialize方法,每次传入不同值时执行isValid方法,返回验证结果

    4.添加字段校验注解必须的方法,并给予默认值,无默认值的需要在使用该注解时指定

        String message();
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    

    5.在类中使用注解

    public class User {
        @NotBlank
        String username;
        @MyContraint(message = "自定义注解")
        String password;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    

    6.在接收前端数据时用@Valid注解,并加上BindingResult类测试输出结果

    @PostMapping("/greet")
        public User greet(@Valid @RequestBody User user, BindingResult errors) {
            System.out.println("进入方法");
            if (errors.hasErrors()) {
                errors.getAllErrors().stream().forEach(error ->{
                    System.out.println(error.getDefaultMessage());
                });
            }
            System.out.println(user);
            return user;
        }
    

    7.输出结果

    image.png

    控制台执行结果打印


    image.png

    若结果出错返回值


    出错的返回值

    相关文章

      网友评论

          本文标题:自定义注解

          本文链接:https://www.haomeiwen.com/subject/llcsvctx.html