第 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);
}

控制器类型转换器

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","-abrtthe 注解类型 converter loaderAnnotationTypeConverterLoader 类型)。

类型转换过程

图 36.1 “类型转换过程” 概述了类型转换过程,显示将给定数据值转换为指定类型到指定类型所涉及的步骤。

图 36.1. 类型转换过程

类型转换过程

类型转换机制如下:

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