美文网首页
自定义注解

自定义注解

作者: 刻骨铭心_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