此内容没有您所选择的语言版本。

12.2. Data Transformation Tutorial


In this tutorial you will learn how to use the data transformation tooling to include data transformation in a predefined Camel route. The Camel route directs messages from a source endpoint that produces XML data to a target endpoint that consumes JSON data. You will add and define a data transformation component that maps the source's XML data format to the target's JSON data format.

Prerequisites

Importing the starter quickstart application

  1. Right-click in Project Explorer to open the context menu.
  2. Select Import Import....
  3. Expand the Maven folder, and select Existing Maven Projects.
  4. Click Next to open the Maven Projects wizard.
    Description
  5. Click Browse to find and select the root directory of the starter quickstart application.
    If the browse operation finds multiple projects, make sure you select the starter quickstart application. The full path to the starter quickstart application appears in the Projects pane.
  6. Click Finish.
    After the import operation finishes, the starter project appears in Project Explorer.
  7. In Project Explorer, expand the starter project.
  8. Double-click starter/src/main/resources/META-INF/spring/camel-context.xml to open it in the route editor.
    Description
  9. Click the Source tab to view the underlying XML.
    You can see that an XML file is produced from a source endpoint and a JSON file is consumed by a target endpoint.
  10. Click the Design tab to return to Design view.
  11. Remove the arrow connecting the source and target endpoints.
    Note
    Do not save your project now. If you do, the endpoints will disappear because they are not connected, which makes the route invalid.
  12. If Console view is not already open, open it now by clicking Window Show View Console.
Note
Although the following mini tutorials are written to be run in consecutive order, you can run through them in any order, but the Console output per tutorial will differ from that shown.

Adding a data transformation node to the Camel route

  1. In the Palette, expand the Transformation drawer.
    Description
  2. Drag a Data Transformation component onto the canvas.
    The New Transformation wizard opens with the Project, Dozer File Path, and Camel File Path fields auto filled.
    Description
  3. Fill in the remaining fields:
    • In Transformation ID, enter xml2json.
    • For Source Type, select XML from the drop-down menu.
    • For Target Type, select JSON from the drop-down menu.
  4. Click Next.
    The Source Type (XML) definition page opens, where you specify either an XML Schema (default) or an example XML Instance Document to provide the type definition of the source data:
    Description
  5. Leave XML Schema enabled.
  6. For Source file, browse to the location of the XML schema file or the XML instance file to use for the type definition of the source data, and select it (in this case, abc-order.xsd).
    The XML Structure Preview pane displays a preview of the XML structure.
  7. In Element root, enter ABCOrder.
    The tooling uses this text to label the pane that displays the Source data items to map.
    The Source Type (XML) definition page should now look like this:
    Description
  8. Click Next.
    The Target Type (JSON) definition page opens, where you specify the type definition for the target data.
    Description
  9. Click JSON Instance Document.
    In the Target File field, enter the path to the xyz-order.json instance document, or browse to it. The JSON Structure Preview pane displays a preview of the JSON data structure:
    Description
  10. Click Finish.
The Transformation editor opens, so you can map data items in your XML source to data items in your JSON target.
Description
The Transformation editor is composed of three panels:
  • Source—lists the available data items of the source
  • Transformations—displays the mappings between the source and target data items
  • Target—lists the available data items of the target
In addition, the editor's Details view, located just below the editor's three panels (once the first mapping has been made), graphically displays the hierarchical ancestors for both the mapped source and target data items currently selected. For example:
Details view with source property customerNum mapped to target property role="italic">custId
Using Details view, you can customize the mapping for the selected source and target data items:

Mapping source data items to target data items

  1. Expand all items in the Source and Target panels located on left and right sides of the Transformations panel.
    Description
  2. Drag a data item from the Source panel and drop it on its corresponding data item in the Target panel.
    For example, drag the customerNum data item from the Source panel and drop it on the custId data item in the Target panel.
    Description
    The mapping appears in the Transformations panel, and the details of both the Source and Target data items appear below in Details view.
  3. Continue dragging and dropping source data items onto their corresponding target data items until you have completed all basic mappings.
    In the starter example, the remaining data items to map are:
    Source Target
    orderNum orderId
    status priority
    id itemId
    price cost
    quantity amount
    Note
    You can map collections (data items containing lists or sets) to noncollection data items and vice versa, but you cannot map collections to other collections.
    Note
    To easily discover which data items are collections, click Show types icon in both the Source and Target panels. (Brackets appear before the name of any data item that is part of a collection.) For an example, see Step 1 in the section called “Adding a custom function to a mapped data item”.
  4. Click Hide mapped fields icon on both the Source and Target panels to quickly determine whether all data items have been mapped.
    Description
    Only data items that have not been mapped are listed in the Source and Target panels.
    In the starter example, the remaining unmapped Target attributes are approvalCode and origin.
  5. Click the camel-context.xml tab to return to the route editor in Design view.
  6. Hover your cursor over each endpoint to reveal its connecter arrow.
    Description
  7. Selecting the file:src/data?fil... node, drag and drop its connector arrow onto the ref:xml2json node. Likewise drag and drop the connector arrow from the ref:xml2json node onto the file:target/messa... node.
    Description
    Connecting the nodes on the canvas creates a valid Camel route, which you can now save.
  8. Click File Save.
You can run a JUnit test on your transformation file after you create the transformation test. For details, see the section called “Creating the transformation test file and running the JUnit test”. If you do so at this point, you will see this output in Console view:
<?xml version="1.0" encoding="UTF-8"?>
<ABCOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com">
    <header>
        <status>GOLD</status>
        <customer-num>ACME-123</customer-num>
        <order-num>ORDER1</order-num>
    </header>
    <order-items>
        <item id="PICKLE">
            <price>2.25</price>
            <quantity>1000</quantity>
        </item>
        <item id="BANANA">
            <price>1.25</price>
            <quantity>400</quantity>
        </item>
    </order-items>
</ABCOrder>
for the source XML data, and
{"custId":"ACME-123","priority":"GOLD","orderId":"ORDER1","lineItems":[{"itemId":"PICKLE",
"amount":1000,"cost":2.25},{"itemId":"BANANA","amount":400,"cost":1.25
for the target JSON data.

Creating the transformation test file and running the JUnit test

  1. Right-click the starter project in Project Explorer, and select New Other Fuse Tooling Fuse Transformation Test.
  2. Select Next to open the New Transformation Test wizard.
  3. In the New Transformation Test wizard, set the following values:
    Field Value
    Package example
    Transformation ID xml2json
  4. Click Finish.
  5. In Project Explorer, navigate to starter/src/test/java/example, and open the TransformationTest.java file.
  6. Add the following code to the transform method:
    startEndpoint.sendBodyAndHeader(readFile("src/data/abc-order.xml"), "approvalID", "AUTO_OK");
  7. Click File Save.
    You can now run a JUnit test on your transformation file at any point in these tutorials.
  8. In Project Explorer, expand the starter project to expose the /src/test/java/example/TransformationTest.java file.
  9. Right click it to open the context menu, and select Run as JUnit Test.
    The JUnit Test pane opens to display the status of the test. To avoid cluttering your workspace, drag and drop the pane in the bottom panel near Console view.
    Description
  10. Open Console view to see the log output.

Mapping a constant variable to a data item

When a source/target data item has no corresponding target/source data item, you can map a constant variable to the existing data item.
In the starter example, the target data item origin does not have a corresponding source data item. To map the origin attribute to a constant variable:
  1. In the Source panel, click the Variables tab to open Variables view.
    Description
  2. In Variables view, click Add a new variable icon to open the Enter a new variable name dialog.
    Description
  3. Enter a name for the variable you want to create.
    For the starter example, enter ORIGIN.
  4. Click OK.
    The newly created variable ORIGIN appears in Variables view in the Name column and the default value "ORIGIN" in the Value column.
  5. Click the default value to edit it, and change the value to Web.
  6. Press Enter.
  7. Drag and drop the new variable ORIGIN onto the origin data item in the Target panel.
    Description
    The new mapping of the variable $(ORIGIN) appears in the Transformations panel and in Details view.
  8. Run a JUnit test on your TransformationTest.java file. For details, see the section called “Creating the transformation test file and running the JUnit test”.
    Console view displays the json-formatted output data:
    {"custId":"ACME-123","priority":"GOLD","orderId":"ORDER1","origin":"Web",
    "approvalCode":"AUTO_OK","lineItems":[{"itemId":"PICKLE","amount":1000,"cost":2.25},
    {"itemId":"BANANA","amount":400,"cost":1.25}]}

Mapping an expression to a data item

This feature enables you, for example, to map a target data item to the dynamic evaluation of a Camel language expression.
Use the target approvalCode data item, which lacks a corresponding source data item:
  1. Click Add a new mapping icon to add an empty transformation map to the Transformations panel.
    Description
  2. From the Target panel, drag and drop the approvalCode data item to the target field of the newly created mapping in the Transformations panel.
    Description
    The approvalCode data item also appears in Details view's target box.
  3. In Details view, click drop-down menu access on the ABCOrder source box to open the drop-down menu.
    Description
    Menu options depend on the selected data item's data type. The available options are bolded.
  4. Select Set expression to open the Expression dialog.
    Description
  5. In Language, select the expression language to use from the list of those available. Available options depend on the data item's data type.
    For the starter example, select Header.
  6. In the Details pane, select the source of the expression to use.
    The options are Value and Script.
    For the starter example, click Value, and then enter ApprovalID.
  7. Click OK.
    Description
    Both Transformations panel and Details view display the new mapping for the target data item approvalCode.
  8. Run a JUnit test on your TransformationTest.java file. For details, see the section called “Creating the transformation test file and running the JUnit test”.
    Console view displays the json-formatted output data:
    {"custId":"ACME-123","priority":"GOLD","orderId":"ORDER1","origin":"Web",
    "approvalCode":"AUTO_OK","lineItems":[{"itemId":"PICKLE","amount":1000,"cost":2.25},
    {"itemId":"BANANA","amount":400,"cost":1.25}]}

Adding a custom function to a mapped data item

You may need to modify the formatting of source data items when they do not satisfy the requirements of the target system.
For example, to satisfy the target system's requirement that all customer ids be enclosed in brackets:
  1. Transformations panel, select the customerNum mapping to populate Details view.
    Description
  2. In Details view, click drop-down menu access on the ABCOrder source box to open the drop-down menu.
    Description
  3. Select Add custom function to open the Add Custom Function page.
    Description
  4. Click create new function button next to the Class field to open the Create New Java Class wizard.
    Description
  5. Modify the following fields:
    • Package—Enter example.
    • Name—Enter MyCustomMapper.
    • Method Name—Change map to brackets.
    Leave all other fields as is.
  6. Click Finish.
    The Add Custom Function page opens with the Class and Method fields auto filled:
    Description
  7. Click OK to open the MyCustomMapper.java file in the Java editor:
    Description
  8. Edit the brackets method to change the last line return null; to this:
    return "[" + input + "]";
  9. Click the transformation.xml tab to switch back to the Transformation editor.
    Description
    Details view shows that the brackets method has been associated with the customerNum data item.
    The brackets method is executed on the source input before it is sent to the target system.
  10. Run a JUnit test on your TransformationTest.java file. For details, see the section called “Creating the transformation test file and running the JUnit test”.
    Console view displays the json-formatted output data:
    {"custId":"[ACME-123]","priority":"GOLD","orderId":"ORDER1","origin":"Web",
    "approvalCode":"AUTO_OK","lineItems":[{"itemId":"PICKLE","amount":1000,"cost":2.25},
    {"itemId":"BANANA","amount":400,"cost":1.25}]}

Mapping a simple data item to a data item in a collection

In this tutorial, you will modify an existing mapping that maps all ids in the Source to the itemIds in the Target. The new mapping will map the customerNum data item in the Source to the itemId of the second item in the lineItems collection in the Target.
With this change, no ids in the Source will be mapped to itemIds in the Target.
Note
To discover which data items are in collections, click Show data types icon at the top of both the Source and Target panels. The data type of each item is displayed next to it.
  1. In the Transformations panel, select the mapping id —> itemId to display the mapping in Details view.
  2. On the Source box, click drop-down menu access to open the drop-down menu, and select Set property.
    Description
  3. In the Select a property page, expand the header node and select customerNum.
  4. Click OK to save the change and open the Collection Indexes page.
    Description
  5. In the Collection Indexes page, click the toggle button next to lineItems to increase its value to 1.
    Indexes are zero-based, so a value of 1 selects the second instance of itemId in the collection.
  6. Click OK to save the change and open the transformation.xml file.
    Description
    Notice that Details view shows customerNum mapped to the itemId of the second item in the lineItems collection.
    Description
  7. Run a JUnit test on your TransformationTest.java file. For details, see the section called “Creating the transformation test file and running the JUnit test”.
    Console view displays the json-formatted output data:
    {"custId":"[ACME-123]","priority":"GOLD","orderId":"ORDER1","origin":"Web",
    "approvalCode":"AUTO_OK","lineItems":[{"amount":1000,"cost":2.25},
    {"itemId":"ACME-123","amount":400,"cost":1.25}]}

Adding a built-in function to a mapped data item

You can use the built-in string-related functions to apply transformations to mapped data items.
  1. In the Transformations panel, select the status to priority mapping to populate Details view.
    Description
  2. In the Source box, click drop-down menu access to open the drop-down menu, and select Add function.
    Description
  3. In the Functions pane, select append, and in the Arguments pane, enter -level for the value of suffix.
    This append function adds the specified suffix to the end of the status string before mapping it to the target priority data item.
  4. Click OK.
    Description
    By default, Details view displays the results of adding the append function to the status data item in a user-friendly format. You can change this formatting by clicking the right-most drop-down menu access on the Source box, and selecting Show standard formatting.
    Description
  5. Run a JUnit test on your TransformationTest.java file. For details, see the section called “Creating the transformation test file and running the JUnit test”.
    Console view displays the json-formatted output data:
    {"custId":"[ACME-123]","priority":"GOLD-level","orderId":"ORDER1","origin":"Web",
    "approvalCode":"AUTO_OK","lineItems":[{"amount":1000,"cost":2.25},{"itemId":"ACME-123",
    "amount":400,"cost":1.25}]}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.