第 36 章 类型 Converters


摘要

Apache Camel 具有内置类型转换机制,用于将消息正文和消息标题转换为不同的类型。本章介绍了如何通过添加自己的自定义转换方法来扩展类型转换机制。

36.1. 类型 Converter 架构

概述

本节介绍了类型转换器机制的整体架构,如果您想要编写自定义类型转换器,则必须了解这些机制。如果您只需要使用内置类型转换器,请参考 第 34 章 了解消息格式

类型转换器接口

例 36.1 “TypeConverter Interface” 显示 org.apache.camel.TypeConverter 接口的定义,所有类型转换器都必须实现。

例 36.1. TypeConverter Interface

package org.apache.camel;

public interface TypeConverter {
    <T> T convertTo(Class<T> type, Object value);
}

控制器类型转换器

Apache Camel 类型转换器机制遵循控制器/worker 模式。有许多 worker 类型转换器,各自能够执行有限数量的转换,单个控制器 类型转换器聚合了 worker 执行的类型转换。控制器类型转换器充当 worker 类型转换器的前端。当您请求控制器执行类型转换时,它会选择适当的 worker,并将转换任务委托给该 worker。

对于类型转换机制的用户,控制器类型转换器最重要,因为它提供了访问转换机制的入口点。在启动过程中,Apache Camel 会自动将控制器类型转换器实例与 CamelContext 对象关联。要获得对控制器类型转换器的引用,您需要调用 CamelContext.getTypeConverter () 方法。例如,如果您有一个交换对象,您可以获得对控制器类型转换器的引用,如 例 36.2 “获取控制器类型 Converter” 所示。

例 36.2. 获取控制器类型 Converter

org.apache.camel.TypeConverter tc = exchange.getContext().getTypeConverter();

类型转换器加载程序

控制器类型转换器使用 类型 converter loader 来填充 worker 类型转换器的 registry。类型转换器加载程序是实现 TypeConverterLoader 接口的任何类。Apache Camel 目前只使用一种类型转换器加载程序(一种类型 converter loader) 类型 converter loader (notation TypeConverterLoader 类型)。

类型转换过程

图 36.1 “键入 Conversion Process” 概述了类型转换过程,显示在将给定数据值转换为指定类型 toType 时所涉及的步骤。

图 36.1. 键入 Conversion Process

类型转换过程

类型转换机制进行如下:

  1. CamelContext 对象包含对控制器 TypeConverter 实例的引用。转换过程中的第一步是通过调用 CamelContext.getTypeConverter () 来检索控制器类型转换器。
  2. 通过调用控制器类型转换器上的 convertTo () 方法来启动类型转换。此方法指示类型转换器将数据对象、 从原始类型转换为 toType 参数指定的类型。
  3. 因为控制器类型转换器是许多不同的 worker 类型转换器的前端,所以它通过检查类型映射 registry (从 Type 类型映射转换器来查询适当的 worker 类型转换器。如果在 registry 中找到适当的类型转换器,控制器类型转换程序调用 worker 的 convertTo () 方法并返回结果。
  4. 如果 无法在 registry 中找到合适的类型转换器,控制器类型转换器会使用类型转换器加载新的类型转换器。
  5. 类型转换器加载器在类路径上搜索可用的 JAR 库,以查找合适的类型转换器。目前,所使用的加载策略通过注解类型 converter loader 实施,该加载尝试加载由 org.apache.camel.Converter 注解注解的类。请参阅 “创建 TypeConverter 文件”一节
  6. 如果类型转换器加载器成功,则会加载新的 worker 类型转换器并输入到类型转换器 registry。然后,这个类型转换器用于将 value 参数转换为 toType 类型。
  7. 如果数据成功转换,将返回转换的数据值。如果转换无法成功,则返回 null
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.