java - 创建自定义注释时 AnnotationProcessor 与 ConstraintValidator 有什么用

标签 java validation customvalidator annotation-processing annotation-processor

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

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

最佳答案

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

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

<小时/>

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

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

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

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

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

<小时/>

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

与注释处理器不同,验证 API 实现必须手动提供,例如

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

你写的

when applied over a method checks and validates the input parameters (Primitive and non-primitive) against various checks

看来您需要编写运行时检查,这意味着验证 API 才是正确的选择。

关于java - 创建自定义注释时 AnnotationProcessor 与 ConstraintValidator 有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969743/

相关文章:

java - 如何获取 UnexpectedRollbackException 的 SQL 错误来源

silverlight - 在 Silverlight 4 中强制验证 ria 实体

asp.net - 单个按钮中的两个验证组,无需客户端单击事件

.NET Web API : Class level validation attribute causes Web API to throw ArgumentNullException if instance is null

c# - CustomValidator OnServerValidate 不工作

java - 在 Optaplanner 中建模 Activity 调度

java - 为 catch block 内的对象添加日志记录

java - 如何向具体用户发送websocket消息?

javascript - 具有相同验证组的 asp.net requiredFieldValidators 不会同时触发

validation - 具有服务器端验证的 MVC2 DataAnnotations