创建自定义注释时,AnnotationProcessor与ConstraintValidator的用途是什么?

问题描述 投票:0回答:2

我需要创建一个自定义Annotation,当应用于方法时,它会根据各种检查检查并验证输入参数(Primitive和non-primitive)。如果检查失败,则应直接返回错误消息。

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

java validation customvalidator annotation-processing annotation-processor
2个回答
2
投票

首先,你需要明白你在谈论两件不同的事情。

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


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

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

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

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

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


另一方面,ConstraintValidatorjavax.validation包下标识Validation API模块附带的接口。这个API有不同的实现,但最常用的是Hibernate Validatordocumentation)。 此接口提供的验证在运行时进行验证。

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

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

你写了

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

您似乎需要编写运行时检查,这意味着Validation API是可行的。


2
投票

AbstractProcessorConstraintValidator的用例非常不同。让我们一起潜水,探索两者。


AbstractProcessor

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.