The DataWeave Language is a powerful template engine that allows you to transform data to and from any kind of format (XML, CSV, JSON, Pojos, Maps, etc).
2. Using the DataWeave Transformer
In Anypoint Studio, you can place a Transform
Message element in a flow to create transformations
using the DataWeave language.
The editor helps you do this by offering intelligent
autocomplete suggestions, an output preview that is
updated in real time as you make changes.
This generates a .dwl transformation file (or several of
them) that stores your code and is packaged with your
Mule application.
3. When adding a Transform Message element to a Mule Flow, it takes the
elements from the incoming Mule Message as its inputs. It then performs
the necessary actions to produce a Mule message as output for the next
element in the flow
4. The DataWeave Text Editor GUI
The Transform Message element allows you to freely
write DataWeave code.
If you click on an instance of the Transform Message element in your flow,
its properties editor will be displayed. This editor is divided into three
sections:
Input
Transform
Output
5. Input Section
In the main tab, a tree view shows the known metadata contents of the
incoming Mule Message, allowing you to explore it and know what data is
available for using as an input, and how to reference each part of it.
If the Mule flow doesn’t expose Metadata about the elements you need from
the incoming message, you can manually specify it. To do so, select the
element of the input you desire to define, note that the pencil icon at the
top right is no longer grayed out. Click this icon to open a new tab in your
input section where you can define a sample with the structure of this data.
6. When the input is of JSON or XML types, the sample input contains plain XML or
JSON code. When the input is of type POJO or DataWeave, the sample input is
written in DataWeave for more simplicity. In these cases the sample DataWeave
code is merely a way to display the sample data, not a transformation in itself.
7. Setting Reader Parameters
Some input formats, like CSV, allow you to
define a reader with specific properties that
make DataWeave parse inputs differently.
Select the input element you wish to configure
on the tree view of the input section, then click
the gear icon.
8. Transform Section
you write the actual DataWeave code that carries out
the transform. Notice that changing the type of your
output directive changes the output section of the
editor. Although DataWeave as a language supports
adding input directives and naming these by any name
you like, in Studio the elements of the input message
are implicitly considered input directives and so they
don’t need to be defined in the header.
9. If Studio has any metadata about the components that are upstream or
downstream from your Transform Message element at the time when you add
the component to your flow, a scaffolding for your DataWeave code is
written out automatically, with as much depth as Studio can intelligently
deduce. In some cases, this code may be enough to carry out the
transformation you need, and no additional coding is needed. Sometimes, all
you need to do is fill in the blank spaces in the scaffolding with references to
the input fields, other times you may want to carry out more complex
operations that involve aggregation, filtering, calculations, defining custom
functions, etc and there you must write this out in DataWeave code.
10. Re-scaffolding Once you’ve added the Transform Message element to your flow, any
further changes you make to the surrounding message processors and their
metadata won’t affect your `.dw`l file. You may still click the Scaffolding
button on the top left of the DataWeave properties editor any time you
want and have a new scaffolding built, note that this will erase anything
you’ve written in the DataWeave body. Doing this won’t affect any
directives you defined in your header (except for the output directive).
Use this button if you’ve made any changes to elements that come after
the Transform Message element on the flow that expose metadata and
don’t mind loosing what you’ve already written into the transform’s body.
11. Referencing Existing Transforms
Instead of defining a new .dwl file, you can reference an existing one by
clicking theData Source button, selecting On File as the source and
referencing the correct file.
12. Handling Multiple Outputs
A single Transform Message element can give shape to several different
components of the output Mule message. Each of these output components
must be defined in a separate .dwl file, written out in a separate tab of the
Transform section. For example in one tab you may be defining the payload
contents, in another those of an outbound property, and these will both be
parts of the same output Mule message
13. To add a new output, click the Plus sign at the
bottom right of the
section:new+output.png[image]
A new tab will then appear, there you can specify
where in the output Mule message to place the
output of this DataWeave transform. In case
you’re creating a new variable or property, you
must also set a name for it.
14. In the XML editor you can do the same by adding multiple child elements inside
thedw:transform-message component.
<dw:transform-message>
<dw:set-payload
resource="classpath:path/transform.dwl"/> <dw:set-variable
variableName="myVariable"
resource="classpath:path/transform.dwl"/> <dw:set-session-variable
variableName="mySessionVariable"
resource="classpath:path/transform.dwl"/> </dw:transform-message>
15. Output Section
This section has two tabs, one of them shows you a neat
expandable tree view of the output data structure, the
other shows you a preview of what the actual output
looks like, built from any sample data you provide in the
input section. As you make changes in the transport
section, notice how the data structure changes. The
output of the transformer is made into the selected
component of the output mule message. If your
transformer has multiple outputs, the Preview tab will
display the one corresponding to the currently selected
transform.
16. Using DataWeave Language
Elsewhere
All components in Mule that support Mule Expression
Language also support expressions written in DataWeave
Language. To invoke an expression written in
DataWeave language, simply invoke the dw() function,
the expression will return whatever the transform
outputs.
DataWeave expressions defined within this function
work just as those defined within a Transform Message
element, the only difference is that the output is
returned into the expression’s result, wherever it may
be.
17. For example, you can define a custom object and populate it with
elements from the payload:
That same expression could be added inside a Logger,
within a MEL expression, to print out its result:
dw(myobject:{id:payload.accountid, user:payload.user})
#[`dw(myobject:{id:payload.accountid, user:payload.user})`]