java - 创建自定义注释时,AnnotationProcessor vs ConstraintValidator 有什么用
问题描述
我需要创建一个自定义注释,当应用于方法时,它会针对各种检查检查并验证输入参数(原始和非原始)。如果检查失败,则应直接返回错误消息。
在搜索时,我在创建自定义注释时遇到了 AbstractProcessor 和 ConstraintValidator 的使用。作为创建自定义注释的新手,我想了解如何继续实施我的问题陈述。
解决方案
首先,您需要了解您在谈论两件不同的事情。
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是要走的路。
推荐阅读
- reactjs - Ant Design - 垂直的复选框组
- python - 使用 Python 和 Selenium 进行抓取 - 如果元素不存在,我应该如何返回“null”
- excel - Powershell:将日期导入 Excel 更改格式
- kubernetes - Minikub 未启动 Ubuntu 18.4
- javascript - 比较并删除字符串的重复部分
- python-3.x - 如何将函数应用于每组数据框
- go - 您将客户端源代码保存在哪里以及如何将其构建到您的应用程序中?
- teradata - 如果 Col2 = (1,2,3),则消除 ID
- java - 在使用 Java 时尝试在 Libgdx 中创建多个屏幕时,出现 com.mygdx.game.MyGdxGame cannot be cast to com.badlogic.gdx.Game 错误
- java - Java 应用程序中的 Maven 冲突与 google-cloud-core-grpc 依赖项