【问题标题】:What is the use of AnnotationProcessor vs ConstraintValidator while creating custom annotation创建自定义注释时,AnnotationProcessor vs ConstraintValidator 有什么用
【发布时间】:2019-03-03 14:15:55
【问题描述】:

我需要创建一个自定义注释,当应用于方法时会针对各种检查检查和验证输入参数(原始和非原始)。如果检查失败应该直接返回错误信息。

在搜索时,我在创建自定义注释时遇到了 AbstractProcessor 和 ConstraintValidator 的使用。作为创建自定义注释的新手,我想了解如何继续实施我的问题陈述。

【问题讨论】:

  • AnnotationProcessor 在编译时处于活动状态,例如可以生成新代码。 ConstraintValidator 在运行时处于活动状态,并检查例如参数是否满足某些约束。
  • 需要注意的是,ConstraintValidator 是 Validation API 的一部分,而 AnnotationProcessor 是随标准 JDK 一起提供的。

标签: java validation customvalidator annotation-processing annotation-processor


【解决方案1】:

首先,你需要明白你说的是两个不同的东西。

TL;DR:编译时与运行时 - 你需要运行时


注解处理器是一个抽象术语,用于标识在编译期间运行的进程,它能够扫描源文件,即带有@的文件987654323@分机号。

注释处理器实现可能会根据任意检查抛出警告甚至错误以停止编译任务。
示例:“我注意到有人将 null 值传递给我的方法,这是一个错误!停止一切!”

实现注解处理器的起点是AbstractProcessor基类,或Processor接口(documentation)。
ConstraintValidator 实现不同,您还需要通过处理器元数据 文件显式注册它,该文件必须位于生成的JAR 工件内的标准目录下。

META-INF/services/javax.annotation.processing.Processor

创建一个注解处理器所需的东西已经包含在标准JDK中了。您不需要外部依赖项。


另一方面,ConstraintValidator 标识与 Validation API 模块一起提供的接口,位于包javax.validation 下。这个 API 有不同的实现,但最常用的是Hibernate Validator (documentation)。
此接口提供的验证是在运行时验证的。

与 Annotation 处理器不同,Validation API 实现必须手动提供,例如

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.15.Final</version>
</dependency>

你写的

当应用于方法时检查并验证输入参数 (原始和非原始)针对各种检查

看来您需要编写运行时检查,这意味着验证 API 是要走的路。

【讨论】:

  • 感谢@LppEdd 的详细解释。两者之间完全混淆,现在很清楚我应该使用哪一个。再次感谢
  • @user3398321 Hibernate Validator 文档非常好。我建议您在开始编写代码之前阅读全部(或其中的一部分)。您可以检查的另一件事是面向方面的编程,特别是 AspectJ。它将为您打开一个新世界。
【解决方案2】:

AbstractProcessorConstraintValidator 的用例完全不同。让我们潜入并探索两者。


AbstractProcessor

适用于大多数具体注释处理器的便捷超类

那么什么是注释处理器,它们的用例是什么?如果你想在编译时生成新的源代码,基于注解,你可以使用注解处理器。它们作为编译过程的一部分提供,并通过 Java 编译器调用。 a static metamodel geneartors for JPA 就是一个例子。


ConstraintValidator 可用于确保在运行时,属性、参数等满足特定约束。最流行的约束之一是@NotNull。在运行时,一些代码,一个约束验证器,检查所有带有@NotNull 注释的字段/参数实际上不是null。如果你想写你自己的约束,你需要写一个注释,以及一个处理器来满足你的约束。 This tutorial on dzone.com 概述了创建自定义注解的过程以及对应的ConstraintValidator

【讨论】:

  • 我希望一个依赖于另一个,而不是相反。事实上,约束验证器实现依赖于注释处理器来处理客户端使用的注释,但没有其他方式。 docs.jboss.org/hibernate/stable/validator/reference/en-US/…
  • @davidxxx 您链接的内容是可选步骤。这不是强制性的。 Hibernate Validator 不依赖注解处理。他们完全分开了。
猜你喜欢
  • 2016-07-03
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多