第 36 章 类型转换器
摘要
Apache Camel 具有内置类型转换机制,用于将消息正文和消息标头转换为不同类型的。本章解释了如何通过添加您自己的自定义转换器方法来扩展类型转换机制。
36.1. 类型转换器架构 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
本节论述了如果希望编写自定义类型转换器,则必须了解类型转换器的总体架构。如果您只需要使用内置类型转换器,请参阅 第 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);
}
package org.apache.camel;
public interface TypeConverter {
<T> T convertTo(Class<T> type, Object value);
}
Master 类型转换器 复制链接链接已复制到粘贴板!
Apache Camel 类型转换器机制遵循主/从模式。有许多 从 类型转换器(各自能够执行有限的类型转换)和单一 主 类型转换器(聚合了从设备执行的类型转换)。主类型转换器充当从类型转换器的前端。当您请求主设备来执行类型转换时,它会选择适当的从设备并将转换任务委派给那个从设备。
对于类型转换机制的用户,master 类型转换器是最重要的,因为它提供了访问转换机制的入口点。在启动过程中,Apache Camel 会自动将 master 类型转换器实例与 CamelContext 对象关联。要获取对 master 类型转换器的引用,您需要调用 CamelContext.getTypeConverter () 方法。例如,如果您有一个交换对象 交换,您可以获得对 master 类型转换器的引用,如 例 36.2 “获取主类型转换器” 所示。
例 36.2. 获取主类型转换器
org.apache.camel.TypeConverter tc = exchange.getContext().getTypeConverter();
org.apache.camel.TypeConverter tc = exchange.getContext().getTypeConverter();
类型转换器加载程序 复制链接链接已复制到粘贴板!
主类型转换器使用 类型转换器 填充从类型转换器的注册表。类型转换器加载程序是实施 TypeConverterLoader 接口的任何类。Apache Camel 目前只使用一类类型转换器 loader ( annotation type converter of converter loader ) ( AnnotationTypeConverterLoader 类型)。
类型转换过程 复制链接链接已复制到粘贴板!
图 36.1 “类型转换过程” 概述了类型转换过程,显示将给定数据值( 值 )转换为指定类型的步骤。
图 36.1. 类型转换过程
类型转换机制继续,如下所示:
-
CamelContext对象包含对 master TypeConverter 实例的引用。转换过程的第一步是通过调用CamelContext.getTypeConverter ()来检索主类型转换器。 -
通过调用 master 类型转换器上的
convertTo ()方法来发起类型转换。此方法指示类型转换器将数据对象(值)从原始类型转换为toType参数指定的类型。 -
由于主类型转换器是许多不同的从类型转换器的前端,它通过检查类型映射的 registry 来查找适当的 slave 类型转换器
,因此类型转换器的注册表由类型映射对(从Type )进行键化。如果在 registry 中找到合适的类型转换器,主类型转换器调用 slave 的convertTo ()方法并返回结果。 - 如果 registry 中无法找到合适的类型转换器,则 master 类型转换器会加载一个新的类型转换器,使用类型转换器加载程序。
-
类型转换器加载程序在类路径上搜索可用的 JAR 库,以查找合适的类型转换器。目前,所用的加载程序策略由注解类型转换器加载,该加载由
org.apache.camel.Converter注解标注的类。请参阅 “创建一个 TypeConverter 文件”一节。 -
如果类型转换器加载程序成功,则会加载一个新的 slave 类型转换器,并将其输入到类型转换器 registry 中。然后,使用此类型转换器将
value参数转换为toType类型。 -
如果数据被成功转换,则返回转换的数据值。如果转换不成功,则返回
null。