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
dw function——dw()
,dwl語句可寫在括號裡面,通過expression transformer解析執行後便能達到和Transformer Message一樣的效果。其語法結構如下: #[dw("<dwl script>","mime type")]
因為dwl在Transformer Message中使用往往帶有格式(比如換行,Tab)。因此不建議通過expression transformer元件的視覺化來配置。而是直接開啟XML中複製dwl程式碼到元件的expression屬性值區域(注意xml中雙引號使用
"
注意使用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
從原始碼角度解析 - ScrollView巢狀ListView只顯示一行的問題
<ScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent">
從原始碼角度解析 - ScrollView巢狀ViewPager不顯示的問題
<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": "每週一吸 · 狸花貓",