原创

自定义注解实现对用户名的存在验证


自定义注解实现对用户名的存在验证

一、注解的基本知识

1.注解的定义

Java文件叫做Annotation,用@interface表示。

2.元注解

在创建注解的时候,需要使用一些注解来描述自己创建的注解,就是写在@interface上面的那些注解,这些注解被称为元注解。

2.1注解的保留策略

@Retention

表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

SOURCE:注解仅存在于源码中,在class字节码文件中不包含

CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到

2.2注解的作用目标

@Target

表示该注解可以用于什么地方,可能的ElementType参数有:

CONSTRUCTOR:作用于构造函数

FIELD:作用于字段、枚举的常量

LOCAL_VARIABLE:作用于局部变量

METHOD:作用于方法

PACKAGE:作用于包

PARAMETER:作用于方法参数

TYPE:作用于接口、类、枚举、注解

ANNOTATION_TYPE:作用于注解

2.3注解包含在javadoc中

@Documented

2.4注解可以被继承

@Inherited

二、实现过程

  • 创建UserNameExistAnnotation
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,ElementType.FIELD})
    @Constraint(validatedBy = UserNameExistValidator.class)
    public @interface UserNameExistAnnotation {
      String message() default "出错了!!!";
      Class<?>[] groups() default {};
      Class<?extends Payload>[] payload() default {};
    }
    
  • 创建UserNameExistValidator类
    public class UserNameExistValidator implements ConstraintValidator<UserNameExistAnnotation,String> {
        @Autowired
        private UserMapper userMapper;
    
        public void initialize(UserNameExistAnnotation constraintAnnotation){
            System.out.println("UserNameExistValidator 初始化了");
        }
        public boolean isValid(String value, ConstraintValidatorContext contrxt){
            //查询是否存在该用户名
            User user=userMapper.queryUserByUsername(value);
            if(user!=null){
                System.out.println(ReflectionToStringBuilder.toString(user, ToStringStyle.MULTI_LINE_STYLE));
                return false;
            }
            return true;
        }
    }
    
  • 在UserVo的username字段上添加@UserNameExistAnnotation(message="该用户名已存在")注解
    
    public class UserVo {
    
        private Integer id;
    
        @Length(min=2,max=18,message="请输入2-18位之间的用户名")
        @UserNameExistAnnotation(message="该用户名已存在")
        private String username;
    
        @Pattern(regexp = "[1-9]([0-9]{2,10})",message = "请输入6-16位之间的任意数字字母或者-_")
        private String password;
    
        @Min(value = 12,message = "年龄必须满足18岁以上")
        private Integer age;
    
        @Past(message = "生日必须是过去的日期")
        private Date birthday;
    
        @NotNull
        private String email;
    
        ...
    }
    
    
  • 启动验证
    • 在传入对象的前面添加@Valid注解,添加BindingResult收集错误信息,取消spring对错误URL的自动拦截
    @PostMapping
    public JsonResult insertUser(@Valid @RequestBody UserVo vo,BindingResult bindingResult){
        bindingResult.getAllErrors().forEach(objectError -> {
            FieldError fieldError=(FieldError)objectError;
            System.out.println(fieldError.getField()+" : "+fieldError.getDefaultMessage());
        });
        System.out.println(vo);
        return JsonResult.isOk(vo);
    }
    
java
SpringBoot
  • 作者:陌攻(联系作者)
  • 发表时间:2021-04-20 12:01
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论