0

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

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

4

2 回答 2

3

首先,您需要了解您在谈论两件不同的事情。

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


Annotation 处理器是一个抽象术语,用于标识在编译期间运行的进程,它能够扫描源文件,即具有.java扩展名的文件。

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

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

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

创建Annotation 处理器所需的内容已包含在标准 JDK 中。您不需要外部依赖项。


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

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

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

你写了

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

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

于 2019-03-03T14:27:52.517 回答
2

AbstractProcessor和的用例ConstraintValidator完全不同。让我们潜水并探索两者。


AbstractProcessor是_

大多数具体注释处理器的方便超类

那么什么是注释处理器,它们的用例是什么?如果你想在编译时生成新的源代码,基于注解,你可以使用注解处理器。它们作为编译过程的一部分提供,并通过 Java 编译器调用。这方面的一个例子是JPA 的静态元模型生成器


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

于 2019-03-03T14:34:24.120 回答