- 后端
- AI 应用
- NLP
【免费下载链接】xberg
Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.
Xberg 是基于 Rust 核心的多语言文档智能解析框架,其插件体系允许在运行时注册文本提取器(extractor)、OCR 引擎、后处理器(post-processor)与校验器(validator)。listValidators()是 Java 绑定暴露的插件管理 API 之一,用于列出当前进程中所有已注册的 validator 名称,是排查插件状态、验证注册结果、实现动态插件治理的入口。读完本文,你将掌握该 API 的签名、返回值、异常处理方式、底层实现机制,以及如何在 Maven 工程中直接运行一个可用的完整示例。
一、Validator 在 Xberg 插件体系中的定位
Xberg 的架构把校验器视为提取流水线中的“质量门禁”:Validator检查提取结果(ExtractedDocument)的质量、完整性与正确性,一旦校验不通过,提取会立即失败(fail fast),而不是像后处理器那样只做修正。从源码看,该 trait 位于 crates/xberg/src/plugins/validator/trait.rs,其注释明确列出典型用途:质量门槛(Quality Gates)、合规检查(Compliance)、内容过滤(Content Filtering)、格式校验(Format Validation)与安全扫描(Security Checks)。
在提取流水线中,validator 运行于后处理器之前,因此可以在任何转换工作发生之前先拒绝不合格的结果(见 docs-site/src/content/docs/concepts/plugin-system.md 中的插件系统概念说明)。每个 validator 都是实现了Validatortrait 的插件,需要同时满足Plugin基接口(提供name()、version()、initialize()、shutdown())与异步validate()方法,且要求线程安全(Send + Sync)。
二、listValidators 的 Java 用法
2.1 方法签名
关联文档 docs-site/src/snippets-generated/java/plugin_api/validators_list.md 给出的示例非常精简。结合 API 参考文档 docs-site/src/content/docs/reference/api-java.md 第 726 行附近的描述,完整的签名是:
public static List<String> listValidators() throws XbergRsException- 返回类型:
List<String>,即所有已注册 validator 的名称列表。 - 异常:调用底层 Rust 原生库失败时抛出
XbergRsException。 - 无参数:不需要任何输入配置,属于查询型(只读、无副作用)调用。
2.2 完整可运行示例
关联文档示例片段如下(原样继承):
import io.xberg.*; public final class Example { public static void main(String[] args) throws Exception { var result = Xberg.listValidators(); System.out.println(result); } }在此基础上,加入 Maven 依赖与遍历输出的完整版本更便于直接运行:
import io.xberg.Xberg; import io.xberg.XbergRsException; public final class ListValidatorsExample { public static void main(String[] args) { try { var validators = Xberg.listValidators(); System.out.println("Registered validators: " + validators.size()); for (String name : validators) { System.out.println(" - " + name); } } catch (XbergRsException e) { System.err.println("Failed to list validators: " + e.getMessage()); e.printStackTrace(); } } }在pom.xml中引入 Java 绑定(io.xberg包由 packages/java 目录下的 Maven 工程构建,包结构见 packages/java/io/xberg/Xberg.java):
<dependency> <groupId>io.xberg</groupId> <artifactId>xberg</artifactId> <version>请以当前构建产物版本为准</version> </dependency>2.3 典型的运行输出
在默认状态下(未注册任何自定义 validator),调用将返回空列表:
Registered validators: 0当注册了自定义 validator 后,输出类似:
Registered validators: 2 - min-length-validator - quality-threshold-validator注意:列表内容取决于当前 JVM 进程内已完成的注册操作。Xberg 的插件注册表是进程级全局状态,不同进程之间的注册互不可见。
三、底层实现原理
3.1 Java → Rust 的调用链
Xberg.listValidators()并非直接实现,而是转发给 JNI 桥接层:
- packages/java/io/xberg/Xberg.java 定义静态方法并委托给
XbergRs.listValidators(); XbergRs通过 JNI 调用 Rust 侧的list_validators函数;- Rust 侧实现在 crates/xberg/src/plugins/validator/mod.rs:
pub fn list_validators() -> crate::Result<Vec<String>> { use crate::plugins::registry::get_validator_registry; let registry = get_validator_registry(); let registry = registry.read(); Ok(registry.list()) }3.2 全局注册表(Registry)
所有 validator 保存在进程级全局注册表中,由 crates/xberg/src/plugins/registry/mod.rs 的get_validator_registry()返回:
pub fn get_validator_registry() -> Arc<RwLock<ValidatorRegistry>> { VALIDATOR_REGISTRY.clone() }该注册表是Arc<RwLock<ValidatorRegistry>>:
Arc保证多个调用方安全共享同一实例;RwLock允许多个读者并发执行list(只读操作),而注册/注销需要独占写锁;- 因为
list_validators()只获取读锁,所以它是**无副作用(side_effect: safe)**的查询操作——这正对应 fixtures 中对validators_list的分类:category 为validator_management,assertions 仅为not_error(见 fixtures/plugin_api/validators_list.json)。
3.3 与注册/注销 API 的关系
listValidators()通常与以下 Rust 侧管理函数配合使用,构成完整的生命周期管理(均位于 crates/xberg/src/plugins/validator/mod.rs):
| 功能 | Rust 函数 | 锁类型 | 说明 |
|---|---|---|---|
| 注册 | register_validator(Arc<dyn Validator>) | 写锁 | 将 validator 加入注册表 |
| 注销 | unregister_validator(name) | 写锁 | 按名称移除 |
| 列出 | list_validators() | 读锁 | 返回所有名称(本文主题) |
| 清空 | clear_validators() | 写锁 | 关闭并清空全部 validator |
Java 侧对应的静态方法为Xberg.listValidators()、Xberg.clearValidators()等。在 e2e/java/src/test/java/io/xberg/e2e/ValidatorManagementTest.java 中可以看到这两个方法的端到端测试用例:testValidatorsList调用Xberg.listValidators()并断言返回非空(非 null)。
3.4 测试中的行为约定
e2e/java/src/test/java/io/xberg/e2e/ValidatorManagementTest.java 的测试约定值得注意:
@Test void testValidatorsClear() throws Exception { // Clear all validators and verify list is empty assertDoesNotThrow(() -> Xberg.clearValidators()); } @Test void testValidatorsList() throws Exception { // List all registered validators var result = Xberg.listValidators(); assertNotNull(result, "expected non-null response"); }从中可以总结出使用约定:即使当前没有任何 validator,listValidators()也不会返回 null,而是返回空列表;调用本身不抛异常(除非底层原生库加载失败)。
四、Validator 的典型使用场景
既然listValidators()用于查询注册状态,理解 validator 的实际工作方式有助于判断何时需要查询。从 crates/xberg/src/plugins/validator/trait.rs 的示例与单元测试(crates/xberg/src/plugins/validator/mod.rs)可以归纳出几个典型模式:
- 最小长度校验:提取内容过短时拒绝,如
MinimumLengthValidator; - 质量阈值校验:根据元数据中的质量分数(如
quality_score)决定是否通过; - 按 MIME 类型条件校验:通过重写
should_validate只对application/pdf等特定类型生效; - 优先级控制:通过
priority()返回不同数值(默认 50)控制校验执行顺序。
当多个 validator 注册在同一进程时,listValidators()是确认“我的插件到底有没有注册成功”的最直接手段,也是调试插件加载问题的第一排查工具。
五、注意事项与最佳实践
- 进程级状态:validator 注册表为进程内全局状态,
listValidators()只能看到当前 JVM 进程中注册的 validator; - 空列表是合法状态:没有注册任何 validator 时返回空列表而非 null,可直接用于条件判断;
- 只读操作:该方法无副作用,可在任何时刻安全调用,不会干扰并发提取任务;
- 异常处理:务必捕获
XbergRsException,它通常意味着原生库加载失败或底层调用出错; - 组合使用:调试时建议先
listValidators()确认注册,再执行提取验证行为;若需要清理现场,可使用clearValidators(); - 生产环境治理:可在服务启动完成后调用该方法并记录日志,用于审计当前进程加载的校验插件版本与数量。
六、小结
listValidators()虽然只是 Java 绑定中的一个查询型方法,但它背后牵动的是 Xberg 完整的插件注册表机制:JNI 桥接 → Rustlist_validators()→ 全局RwLock<ValidatorRegistry>读锁 →registry.list()。掌握这个调用链,也就理解了 Xberg 插件体系的进程级生命周期管理方式。实际使用中,将其与register_validator、unregister_validator、clear_validators组合,即可对校验插件进行完整的动态治理。
如需继续深入了解,可查阅:
- 插件系统概念:docs-site/src/content/docs/concepts/plugin-system.md
- Java API 完整参考:docs-site/src/content/docs/reference/api-java.md
- Java 绑定源码:packages/java/io/xberg/Xberg.java
- Rust 实现:crates/xberg/src/plugins/validator/mod.rs
- 端到端测试:e2e/java/src/test/java/io/xberg/e2e/ValidatorManagementTest.java
- 后端
- AI 应用
- NLP
【免费下载链接】xberg
Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.
相关推荐
使用 Dart 绑定查询 Xberg 已注册 Post-Processor:listPostProcessors 实战指南
使用 Dart 绑定查询 Xberg 已注册 Post Processor:listPostProcessors 实战指南 本篇技术指南以 xberg 仓库的
后端AI 应用NLP使用 xberg Go 绑定查询已注册的后处理器:ListPostProcessors 实战指南
使用 xberg Go 绑定查询已注册的后处理器:ListPostProcessors 实战指南 本文围绕 xberg 文档自动生成的一则 Go 代码示例( d
后端AI 应用NLPXberg C 绑定实战:用 ListTokenizerBackends 查询已注册的 Tokenizer 后端
Xberg C 绑定实战:用 ListTokenizerBackends 查询已注册的 Tokenizer 后端 导读 :本文围绕 Xberg 开源仓库中 C
后端AI 应用NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考