Camel 中的转换:如何进行
想要你的数据,你的方式?了解可以在 Apache Camel 中转换数据的所有不同方式。
你如何在 Apache Camel 中转换数据?
如果您刚刚
处理器?其中的EIP一样的东西?消息翻译器?
在 Camel 中转换数据通常通过以下方式之一完成:
-
使用 Java 代码和类型转换器进行映射
-
使用专门的 Camel 组件,如 XSLT、Bindy 或 Atlasmap
-
使用数据格式Marshalling/unmarshalling(编组/解组),如 CSV 和 JSON
-
使用模板引擎,如
Camel 中的转换方法:编组、类型转换和模板!
那么你怎么知道选择哪一个呢?毕竟,他们似乎都在做同样的事情,不是吗?
让我们来看看它们中的每一个。
我不会在这里推荐一种方法而不是另一种方法。本文旨在为您提供选项的广泛概述,以便您可以深入研究 Camel 文档和示例并做出选择。
那么让我们来看看吧!
使用 Java 代码进行转换
也被称为……Java架构师的梦想
在这种方法中,您的输入和输出数据都需要是 Java 对象,并且您使用 Java 语句在它们之间进行映射。当您需要从源类型转换为目标类型时,您可以编写一个方法来创建一个新的目标对象,并使用源对象中的相关字段填充它。然后,您告诉 Camel 调用该方法(例如 using bean
,或者可能是Processor)。
例如,您可以将Lead
对象转换为Customer
. 所以你写了一个转换方法public static Customer convertToCustomer(Lead lead)
:
public static Customer toCustomer(Lead lead) { Customer customer = new Customer(); customer.setName(lead.getName()); customer.setCompany(lead.getCompany()); customer.setCity(lead.getCity()); return customer; }
如果您的源数据作为基于文本的格式(如 🖹 XML 🖹)进入 Camel,那么首先您需要从基于文本的格式
这种方法是正确的,全面的 Java。它通常需要编写大量 Java 代码。但是,它也是强类型的。在我看来,这是一件好事。Java 类型系统的伟大之处在于您获得了内置的“类型安全”——例如,您不能将String
值放入专为Integer
.
有一些工具可以使这个过程更容易一些。如果您正在使用 XML,那么您可以使用 Java 的
如果……那就更好了。你注册一个 TypeConverter
编写转换代码后,您可以
但是,你可以把它更多... Camelly ......通过注册它作为一个类型转换器。这增加了你的代码,以骆驼图书馆适配器,可以转换从Java对象TypeA
到TypeB
。当您编写自己的转换代码时,您可以将其注册为TypeConverter,以便 Camel 知道它如何从您Lead
的Customer
.
为此,您只需将@Converter
注释添加到您的类中:
import org.apache.camel.Converter; @Converter public class CustomerConverter { ... }
您还将完整的类名添加到文件中resources/META-INF/services/org/apache/camel/TypeConverter
:
com.cleverbuilder.cameldemos.typeconverters.CustomerConverter
现在您可以.convertBodyTo(Customer.class)
在
使用专门的 Camel 组件(端点)进行转换
也称为…… *将工作交给专家*
编写 Java 代码“很好”。尽管我不会称之为“令人愉快”,除非您真的很喜欢编写大量的样板代码。因此,您可能想知道是否有工具可以帮助您从一种格式转换为另一种格式——而无需自己编写所有这些样板代码。
这就是专业转换组件的用武之地。他们是一群工人,您可以召集他们来完成特定的工作。与一些工人不同的是,他们通常会准时出现,并且不会说“我不能为你做这件事,因为我不是合格的伙伴。但这次访问我仍然会向你收费。”
当您初始化这些组件之一时——无论是在代码中显式地,还是在像 Spring Boot 这样的框架中自动地初始化——您都会得到一个端点,您可以通过它来推送消息,作为路由的一部分。当消息通过 Endpoint 时,该组件启动,转换您的消息,并返回输出。
这使您的 Camel 路线看起来像这样:
from("file:somewhere...")
.to("some-component:blah?someConfig=1&anotherConfig=true")
.to("file.....")
如您所见,您的 Camel 代码看起来相当干净。现在您使用 Camel 作为协调器,将工作交给其他组件来完成。
那么,祈祷一下,这些🎠 神奇的组件🎠 是您可以使用的吗?Camel 中这些转换组件的一些很好的例子是:
成分 | 它能做什么 | 基于 |
---|---|---|
使用 XSLT 转换文件直接将 XML 转换为 XML。当你看到它时,你就会知道其中之一。 | ||
如果您想使用 Saxon 库,请使用此组件。为您提供一些更高级的转换和更好的性能。 | ||
Dozer 用于 Java 到 Java 的映射。它用一个 XML 映射文件替换了上面所有的样板代码。(这是否是一件好事值得商榷:-)) | ||
这是街区的新来的孩子。它可以在 JSON、XML 和 Java 对象之间进行映射。就像 Dozer 一样,它使用映射文件。您可以使用 |
使用数据格式
也称为……*编组器和解组器。*
这是另一块拼图。
配置数据格式后,您可以将其插入编组或解组步骤,如下所示:
// import org.apache.camel.dataformat.csv.CsvDataFormat; // import org.apache.camel.model.dataformat.JsonDataFormat; // Set up a CSV data format CsvDataFormat csv = new CsvDataFormat(); // Set up a simple JSON output format JsonDataFormat json = new JsonDataFormat(JsonLibrary.Jackson); // Convert an incoming CSV into JSON from("direct:start") .unmarshal(csv) // unmarshal from CSV .marshal(json) // marshal out to JSON .to("direct:end");
*Bindy*是一种可定制的数据格式,可以处理固定宽度(例如 FIX)和可变宽度(例如 CSV)文件。Bindy 是一个非常酷的库,可以帮助您摆脱困境,尤其是当您使用一些非常不寻常或旧的文件格式时。
有了 Bindy,只要你能建立文件格式的规则——比如第一列有多少个字符,分隔符是什么等等——你可以用 Camel 来处理。
查看正在运行的 Bindy 演示。
使用模板引擎
也被称为……*我需要为老板制作一份报告*
我将在本文中介绍的最后一个选项是模板引擎。如果您需要构建任何类型的人们可以看到的文本输出,这些都非常棒。
想想电子邮件、文档、网页之类的东西…… 就像邮件合并一样,模板引擎可以采用模板和一些源数据并生成文档。
如果您仍然不确定我的意思,那么我说的是对
在 Camel 中,模板引擎从您的Exchange读取值。因此它可以访问诸如消息正文和标题之类的内容。
Camel 有一些模板引擎的组件。我没有处理过所有这些,所以我不知道它们之间的区别,但是如果您需要特定的东西,请先查看每个文件的文档:
-
-
Freemarker
-
Mustache
-
MVEL
-
Velocity
简而言之,这就是骆驼的转变
这是 Apache Camel 中转换的概述。您有很多不同的选择,具体取决于您需要 Camel 做什么。