第 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); }
Master 类型转换器
Apache Camel 类型转换器机制遵循主/从模式。有许多 从 类型转换器,各自能够执行有限数量的转换,以及单个 主 类型转换器,聚合了从卷执行的类型转换。主类型转换器充当从类型转换器的前端。当您请求 master 执行类型转换时,它会选择适当的从设备,并将转换任务委托给该从设备。
对于类型转换机制的用户,主类型转换器最重要,因为它提供了访问转换机制的入口点。在启动过程中,Apache Camel 会自动将主类型转换器实例与 CamelContext
对象关联。要获得对 master 类型转换器的引用,您需要调用 CamelContext.getTypeConverter ()
方法。例如,如果您有一个交换对象,您可以获得
对 master 类型转换器的引用,如 例 36.2 “获取主类型 Converter” 所示。
例 36.2. 获取主类型 Converter
org.apache.camel.TypeConverter tc = exchange.getContext().getTypeConverter();
类型转换器加载程序
主类型转换器使用 类型转换器加载器 来填充从类型转换器的 registry。类型转换器加载程序是实现 TypeConverterLoader 接口的任何类。Apache Camel 目前只使用一种类型转换器加载程序(一种类型 converter loader) 类型 converter loader (notation TypeConverterLoader
类型)。
类型转换过程
图 36.1 “键入 Conversion Process” 概述了类型转换过程,显示在将给定数据值转换为指定类型 toType
时所涉及的步骤。
图 36.1. 键入 Conversion Process

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