1. 程式人生 > >MULE DW Function & 使用expression transformer解析巢狀MEL

MULE DW Function & 使用expression transformer解析巢狀MEL

工具 版本
mule-standalone 3.9.0
Anypoint-Studio 6.4.0

Dataweave Function

dataweave language十分強大,能夠完成各種格式的轉換。其使用場景一般是在Transformer Message元件中使用,通過在元件配置介面裡面編寫dwl能夠將input轉換為你所需要的output。但是實際上,除了Transformer Message元件外,dwl還能配合expression transformer元件來使用。

Expression Transformer元件圖

expression transformer

中使用dwl使用的是Mule提供的dw function——dw(),dwl語句可寫在括號裡面,通過expression transformer解析執行後便能達到和Transformer Message一樣的效果。其語法結構如下:
#[dw("<dwl script>","mime type")]
因為dwl在Transformer Message中使用往往帶有格式(比如換行,Tab)。因此不建議通過expression transformer元件的視覺化來配置。而是直接開啟XML中複製dwl程式碼到元件的expression屬性值區域(注意xml中雙引號使用&quot;
),
注意使用dw函式需要指定轉換後的輸出型別。

使用例子

#[dw("payload map ((arrayVal,arrayIdx)->  arrayVal   mapObject ((objVal,objIdx)->   '$objIdx':objVal  ) )","application/json")]

如果轉換的Dataweave語句是固定的,那麼實際上使用Transformer Message或者Expression Transformer都可以,但是如果Dataweave語句的內容不能確定,動態傳入的情況中,那麼Transformer Message就捉襟見肘了。因為其dwl語句在開發時是寫死的。

存在當前場景:根據不同的情況,Dataweave語句是從資料庫中讀取的,並且保留到了flow變數中儲存,變數名為dw_statement。

如果此時在Expression Transformer設定表示式#[flowVars.dw_statement],那麼並不能達到執行Dataweave的效果。因為該元件只會解析出flow變數中Dataweave語句,但是並不會予以執行。簡而言之,如果你想通過該元件智慧地給你解析MEL中巢狀的MEL,簡單地放入一個MEL表示式是不行的。

通過閱讀官方文件,會發現官網提供在Expression Transformer中提供了好幾個Evaluator,那麼這時候使用其中一個名為processor Evaluator將會解決上面的問題。

姑且稱Evaluator為評估器,該process評估器的表示式語法是#[process:processorName:valueToProcess]

(官網對其解釋)Invokes a message processor within an expression. This processor can be any component, transformer, custom processor, processor chain or flow. This evaluator is most useful when used with a nested expression that determines the value that is processed by the referenced message processor.

表示式讓我們指定一個processor來給我們處理這個valueToProcess,這個process可以是一些其他的元件,flow,轉換器之類的元件,因此便有了下面的圖:
process Evaluator使用圖

圖紅色文字部分最後少了一個]中括號

在上面擷取的結構圖中,通過從資料庫中獲取到了Dataweave語句並儲存到flow變數中,然後接一個表示式元件並且配置了圖中的表示式。該表示式呼叫了一個名為getDataweaveProcessor的subflow。這個flow便是關鍵,它來真正解析我們儲存在flow變數的dwl語句(其中訊息增強和Object to JSON元件並不是關鍵,而是因為我所使用的dwl場景所需要使用而已)。子flow裡面使用了一個Java Component元件,其程式碼如下:

package com.data.center.utils;

import org.apache.log4j.Logger;
import org.mule.DefaultMuleEvent;
import org.mule.api.MuleEvent;
import org.mule.api.MuleEventContext;
import org.mule.api.lifecycle.Callable;

public class ExpressionEvaluatorInJava implements Callable {
    private static final Logger logger = Logger.getLogger(ExpressionEvaluatorInJava.class);

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        //獲取存有dataweave的流變數語句
        String dw_statement = eventContext.getMessage().getInvocationProperty("dw_statement").toString();
        MuleEvent muleEvent = new DefaultMuleEvent(eventContext.getMessage(), eventContext.getExchangePattern(),
                eventContext.getFlowConstruct());
        Object response = eventContext.getMuleContext().getExpressionManager().evaluate(dw_statement, muleEvent);
        return response;
    }

}

在java中,我們獲取流變數中儲存的Dataweave語句,並且通過JAVA程式碼來呼叫表示式解析,而這裡處理的內容就是我們Expression Transformer中傳遞的payload,表示式中傳遞的值到了子flow中將變為該flow的負載。response就是我們通過dwl轉換的結果內容。

至此達到從flow變數中動態獲取Dataweaeve語句解析執行的效果。之所以會有上述一系列的做法,無非就是為了更為靈活地適配不同情況下使用Dataweave來轉換資料,如果有更好更方便的方法,歡迎留言評論。

相關推薦

MULE DW Function & 使用expression transformer解析MEL

工具 版本 mule-standalone 3.9.0 Anypoint-Studio 6.4.0 Dataweave Function dataweave language十分強大,能夠完成各種格式的轉換。

PLSQL 解析json資料

1:解析如下json格式資料,巢狀部分:TEST1,TEST2 { "Order": [{"TEST1":{"TEST2":{ "orderType": "LSCK", "amount": "376.00", "orderId": "18090501706539",

fastjson可以解析的內部類嗎?

類圖: 內部類: public class D3 { private D1 d1; private D2 d2; public D1 getD1() { return d1; } public void se

fastjson解析內部類

平時開發中,可能會遇到呼叫第三方介面返回json串的情形,有時候資料層級結構太複雜時如果要解析為物件,會需要定義多個。其實沒必要,fastjson支援解析巢狀類 public class VideoMs

fastjson解析泛型

/** * author zoush * CreateTime 2017-06-03 16:01 * 直接上虛擬碼 */ public class Outer<T> {

Gson和fastJson 解析泛型的json資料

Test /* * { "code": 1, "datas": [{ "address": "深圳",

用fastjson解析json資料

json資料類似: { "code": 0, "data": { "city": { "cityId": 284609, "counname": "中國", "name": "東城區", "pname": "

使用 fastjson 解析的 json 資料

假設現在有這樣一個 JSONObject { "data": { "is_admin": false, "app_id": 10, "user"

SSM pageHelper + 前端 Bootstraptbale分頁 + 解析的二級json資料

ssm  後臺使用pageHelper 分頁外掛 前端使用Bootstraptable 外掛   廢話不多說  先上圖為了大家能更快的掌握 ,我不加其他花哨的內容    bootstrapboot 裡的屬性我就設定了常用幾個下面是jsp頁面的程式碼   一共要引入5個檔案 

Gson解析JSON格式資料

來源說明: 最近在無聊,剛剛又想學一下安卓的APP, 剛剛好看到"中國天氣網"那裡面的有免費的API.剛剛好又想到用GSON解析,我學了一下. 1.資料格式 { "user":"

Gson解析

Gson解析還是不錯的,比起我剛學Android那會手動解析省事不少,但是關於實體類巢狀,簡單介紹一下 Gson gson = new Gson();//初始化Gson A   a = gson.fromJson(“json字串”, A.class);//直接用A接受  

BootStrapTable(一) -- 怎麼解析Json資料

bootStrapTable只支援{“id”:”123”,”name”,”tom”}這種型別的資料解析,如果後臺傳入複雜 JSON 資料 , 他是不支援的 , 這時候就需要把獲取的資料分解 . 例如 我的 JSON 資料的格式是 {"rows":[{

例項解析的JSON格式資料

關於JSON資料格式的基本知識和概念,參看: http://www.cnblogs.com/zouzf/archive/2012/03/31/2426646.html var = { "resultcode":"200", "reason":"Successe

透過 NestedScrollView 原始碼解析滑動原理

NestedScrollView 是用於替代 ScrollView 來解決巢狀滑動過程中的滑動事件的衝突。作為開發者,你會發現很多地方會用到巢狀滑動的邏輯,比如下拉重新整理頁面,京東或者淘寶的各種商品頁面。 那為什麼要去了解 NestedScrollView 的原始碼呢?那是因為 Nest

從原始碼角度解析 - ScrollViewListView只顯示一行的問題

<ScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent">

從原始碼角度解析 - ScrollViewViewPager不顯示的問題

<ScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent">

Java解析post請求兩層json資料

案例: 請求資料:  程式碼段:  @RestController @RequestMapping("test") public class testDemo { @PostMapping("demo") public void test(

SSM 生成mapper中xml檔案:未能解析對映資源:“檔案異常

錯誤日記我就網上隨便找個貼著: 錯誤一: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path res

所見即所得,使用Java將HTML解析為Excel,支援多級表頭、單元格合併

最近專案需要實現如題“所見即所得”的功能,之前每次生成Excel都需要重新從資料庫查詢一遍,降低效率不說,那些巢狀的表頭實在是很難用Sql巢狀拼接實現。而且這樣做還沒有通用性,不同的表格需要寫不同的Sql實現,非常繁瑣。         在網上找了很

手把手教你怎麼解析多層的JSON資料(使用JSONModel)

使用API API介紹 參考的JSON資料(可能與你看到的不同) { "date": "20181020", "stories": [ { "title": "每週一吸 · 狸花貓",