为啥加了@NotBlank就可以校验不为空 原理是什么?

为啥加了@NotBlank就可以校验不为空 原理是什么?

阅读 9.2k
3 个回答

你可以去看看java注解的原理, 注解其实就是一个类定义了一些属性, 其实那些功能的实现并不在注解类里, 而在调用者那

调用者通过反射获取属性或方法上的注解, 实现一些功能

单独一个注解是没有作用的, 每个注解必然存在一个调用者
比如我有一个User

class User {
    @NotBlank
    private String username;
    //...
}

我就可以实现一个方法

boolean verification(User user){
    //通过反射获取user中属性
    //遍历属性, 获取属性的注解, 当存在NotBlank注解时判断属性是否为空, 为空则返回false
    //正常返回true
}

这就是一个简单的例子, 可以看到这里@NotBlank只是起到了一个标记的作用

其他注解的功能也大致如此, 有的只是没有这么明显的调用从而让人误以为加上注解自然而然就有这个功能了
就像Spring中的@RequestMapping其实也通过代理Controller的方法来实现url映射

Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
    // 检测是否有@NotEmpty注解
    if(field.isAnnotationPresent(NotEmpty.class)){
        field.setAccessible(true);
        // 如果为空 抛出一个异常
        if(field.get(arg) == null){
            // 获取到注解中的value里的内容作为异常的信息抛出
            NotEmpty annotation = field.getAnnotation(NotEmpty.class);
            Method value = annotation.annotationType().getDeclaredMethod("value");
            value.setAccessible(true);
            throw new EmptyException(value.invoke(annotation).toString());
        }
    }
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotEmpty {
    //错误信息
    public String value() default "存在非空字段为空";
}

我之前一个项目自己写的@NotEmpty的注解 然后这段代码是拿来验证是否为空的

这是一种Bean Validation 的规范,你也可以定义一个自己的校验器来进行模型校验
欢迎关注【侠梦的开发笔记】 之 Bean Validation参数校验笔记

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题