<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    月蝕傳說

    浮躁讓人失去理智
    posts - 25, comments - 101, trackbacks - 0, articles - 0
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    Smooks 工具 - QuickStart

    Posted on 2009-08-24 19:00 Dart 閱讀(6599) 評論(2)  編輯  收藏 所屬分類: JBoss SOA 產品

    English Version

    Smooks Tools 是一個針對Smooks數據轉換平臺而開發的一個工具,整個工具是基于Eclipse的。


    工具目前主要是由兩個編輯器組成:1.Smooks configuration file編輯器,也就是Smooks Configuration Editor。2.EDI消息映射配置文件編輯器,EDI Message Mapping Editor。


    本文將簡要介紹一下Smooks configuration editor。


    Quick Start


    為了能夠快速熟悉一下整個編輯器,我將通過一個QuickStart作為整片文章的開始。本例將講述怎么使用Smooks tools創建,配置Java-to-Java轉換所需的配置文件,以及如何編寫Smooks代碼進行運行該例。


    下載以及安裝


    首先需要先下載Eclipse以及Smooks工具的Plugin:

    Eclipse WTP 3.1 :http://www.eclipse.org/downloads/

    Smooks Tools : http://www.jboss.org/tools/download.html


    下載好Eclipse WTP后,解壓縮到某個目錄下,然后將smooks tools壓縮包解壓后,找到./plugins文件夾,將該文件夾下的jar文件復制到Eclipse WTP對應的文件夾(./eclipse/plugins)下。


    然后我們需要去到Smooks.org下載Smooks 1.2.1


    完成后啟動Eclipse,在菜單欄上選擇:Help -> About Eclipse SDK -> Installation Details -> Plug-ins ,在列表中我們會看到Smooks tools所對應的3個plugin:

     

    這說明Smooks tools已經安裝成功了。


    新建Smooks項目


    在eclipse中我們新建一個Java工程,在項目下新建一個libs文件夾,然后將所下載的Smooks 1.2.1中的libraries復制到該文件夾下,并將這些libraries加入到java項目的classpath當中(右鍵點擊項目-> Properties -> Java Build Path -> Libraries -> Add JARs... )


    然后在該項目中創建我們所要轉換的目標Java類以及轉換輸入Java類。(這些Java類以及代碼都來自Smooks 1.2.1中的Java-to-Java example,讀者可以去自行下載該例,或者直接從本文給出的鏈接中下載)。


    映射規則


    在使用Smooks tools工作之前,我們需要先搞清楚映射的規則:


    轉換輸入Java類example.sourcemodel.Order類,具有以下結構:

     

    1.Order類本身

    2.Order包含有一個Header類,以及一個List類

    3.Header類具有customerName,customerNumber,priority三個屬性

    4.List中將存放的是一個OrderItem類

    5.OrderItem具有price,productId,quantity三個屬性


    讓我們看看轉換目標類LineOrder:



    該結構為:

    1.LineOrder類包含有customerId,customerName,priority 三個屬性以及一個lineItems的數組。

    2.數據lineItems是由LineItem組成

    3.LineItem具有productCode,unitPrice,unitQuantity三個屬性。


    了解完轉換輸入以及轉換目標的結構后,我們將要以下列的規則來將轉換輸入映射到轉換目標中:


    1.每一個Order類的實例對應生成一個LineOrder的實例

    2.Order實例中Header的customerName值將賦值到對應LineOrder實例中的customerName

    3.Order實例中Header的customerNumber值將賦值到對應LineOrder實例中的customerId

    4.Order實例中Header的proiority值將賦值到對應LineOrder實例中的proiority

    5.每一個Order實例中的orderitems List的實例將對應生成一個LineOrder中的lineItems數組對象,并且orderItem List中的OrderItem實例將會對應生成一個LineItem對象,該LineItem的對象會被放置到生成的lineItems數組對象中。

    6.OrderItem實例中的productId值將賦值到對應LineItem對象中的productCode

    7.OrderItem實例中的price值將賦值到對應LineItem對象中的unitPrice

    8.OrderItem實例中的quantity值將賦值到對應LineItem對象中的unitQuantity


    請仔細閱讀以上規則后進入到下一節。


    新建Smooks configuration file


    我們選中所建項目的src文件夾,點右鍵,選擇New -> Other... -> Smooks -> Smooks Configuratin File.


     


    然后點擊Next > ,選擇所要生成smooks config file所在的文件夾,選擇到所生成項目的src下,然后點擊Finish完成配置文件的創建。


     


    我們將會看到新建的smooks conig file , 并且該文件自動被Smooks Configuration Editor打開。


     


    添加輸入數據


    在該編輯器的下方有一組tab按鈕,分別是:

    Overview, Reader , Message Filter ,Graph , Source


    首先第一步,我們需要將轉換輸入Order類添加進來,點擊Reader tab,切換到Reader/Input編輯頁。


     

    在該編輯頁的下方,我們可以看到一個Input Data的列表,點擊該列表右側的Add按鈕,根據向導,添加一個Java輸入:

     

     


    確定后點擊Finish,Order類將被作為輸入數據添加進來。


    添加目標Bean


    完成輸入數據的添加后,我們切換到Message Filter頁。

     

    點擊Add按鈕,將有一個向導頁出現。


    我們選擇Java Binding v1.2 -> Bean v1.2 然后確定,添加一個Bean:


     

    這時我們會發現在Message Filter頁面中增加一個Bean v1.2項,選中該項,在頁面的右側將會顯示出它可配置的屬性:


     

    在bean Id 處,我們輸入lineOrder,作為該Bean的id,在Class處我們點擊Browse按鈕,選擇LineOrder類作為該Bean的Class。

    (溫馨小貼士:選中Class的文本框后,可以輸入字符,然后按Alt+/ 鍵,將會有內容幫助窗口彈出,這樣的可以提高效率。如果輸入Alt + /無效果,可以使用Ctrl + space,這是Eclipse的內容幫助快捷鍵,在不同的平臺上會有不同)


    將這兩項值輸入完成后,我們點擊下方的Add Binding , 將會彈出一個對話框,讓我們選擇所有添加的Bean的綁定屬性:


     


    全選后點擊OK,我們會看到在左側的Bean元素下,會生成一組屬性綁定元素:

     

    我們按照上述方法,再生成一個數組Bean lineItems以及一個LineItem的Bean。


    這兩個Bean所對應的Class以及Bean id 為:


    數組Bean ,BeanId : lineItems , Class : example.trgmodel.LineItem[]
    LineItem Bean , BeanId : lineItem , Class : example.trgmodel.LineItem


    (溫馨小貼士:作為數組bean,其class的值一般是以[]作為結尾,說明該bean是一個數組類型,而class中的類名則是數組所存放的bean的類型)

    完成后,分別使用Add Binding鍵,將對應的綁定屬性都添加好。


    最后的結果如下:


     

    我們看到有很多小紅叉在這些Binding元素上,這是因為我們還沒有設置其對應的源的Selector值。

    (溫馨小貼士:關于selector請到smooks.org上查看相關的描述)


    創建映射


    現在讓我們切換到Graph頁面,我們會看到一組圖形:


    現在我來對該圖做一個介紹:


    最左側沒有標題的圖形是我們設定的Input Data,它是以樹形結構的形式展現的。

    右側從上到下, Bean v1.2 這是我們在Message Filter中添加的一個Bean v1.2 ,現在顯示在Graph頁中,它的子圖形是它所對應的binding子項。請參照上一節。


    現在我們可以試著選中最左側的圖形的根節點“Order”,然后拖拽它,我們會發現會有一根線出現。我們將它拖拽到Bean v1.2 (lineOrder)上后釋放,在這兩個圖形中出現了一條線。


    這條線表示:Order 實例將會根據Bean v1.2 (lineOrder)中所描述的class,對應生成一個實例。我們在前幾個章節“映射規則” 中已經說明了。


    現在我們根據映射規則,將輸入圖形對應的點映射到Bean對應的圖形上:


    1.每一個Order類的實例對應生成一個LineOrder的實例

       操作:將order點連接到lineOrder上


    2.Order實例中Header的customerName值將賦值到對應LineOrder實例中的customerName

      操作:將customerName連接到 lineOrder.customerName上


    3.Order實例中Header的customerNumber值將賦值到對應LineOrder實例中的customerId

      操作:將customerNumber連接到 lineOrder.customerId上


    4.Order實例中Header的proiority值將賦值到對應LineOrder實例中的proiority

       操作:將proiority連接到 lineOrder.proiority上


    5.每一個Order實例中的orderitems List的實例將對應生成一個LineOrder中的lineItems數組對象,并且orderItem List中的OrderItem實例將會對應生成一個LineItem對象,該LineItem的對象會被放置到生成的lineItems數組對象中。

       操作:先將lineOrder.lineItems連接到lineItems圖形上,然后將orderItems連接到 lineItems上 , 并將lineItems的子圖形lineItems.LineItem連接到lineItem上


    6.OrderItem實例中的productId值將賦值到對應LineItem對象中的productCode

       操作:將productId連接到 lineItem.productCode上


    7.OrderItem實例中的price值將賦值到對應LineItem對象中的unitPrice

       操作:將price連接到 lineItem.unitPrice上


    8.OrderItem實例中的quantity值將賦值到對應LineItem對象中的unitQuantity

       操作:將quantity連接到 lineItem.unitQuantity上


    最后我們得到以下的圖形:


     

    在這里,我們需要回到Message Filter頁面,選中Bean v1.2 (lineItems)節點,將它的property值刪除,因為它所對應的是數組,所以不應該具有property值。


    我們的映射工作已經完成,還有一些類型匹配上的工作沒有做。


    切換到Message Filter頁,我們需要對一些屬性的類型進行一些映射。

    1.lineItem.unitPrice ,選中該元素,在它的Decoder中輸入BigDecimal

    2.lineItem.unitQuantity , 險種該元素,在她的Decoder中輸入Integer

    3.lineOrder.priority , 選中該元素,點擊右鍵,選擇 Add Smooks Resource -> Decod Param Type,一個增加四組。

    對應的Name和Value分別是:

    enumType :example.trgmodel.LineOrderPriority


    LOW :NOT_IMPORTANT


    MEDIUM : IMPORTANT


    HIGH:VERY_IMPORTANT


    保存文件。自此,我們的配置工作就完成了。


    運行轉換測試


    先下載Main類,然后放到項目中,運行該類,測試轉換是否成功。


    評論

    # re: Smooks 工具 - QuickStart  回復  更多評論   

    2012-05-21 23:17 by xuj
    你好!能告下訴下:
    .EDI消息映射配置文件編輯器這個在哪可以下載到
    xujie123#gmail.com

    # re: Smooks 工具 - QuickStart  回復  更多評論   

    2014-08-20 12:24 by lgm
    我有個問題想問下:
    我有個xml文件是全量字段的C3有4個字段,但是我實際報文中只傳了1個參數,
    運行時就會報錯
    Exception in thread "main" org.milyn.SmooksException: Unable to filter InputStream for target profile [org.milyn.profile.Profile#default_profile].
    at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:294)
    at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:243)
    at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:216)
    at org.milyn.Smooks._filter(Smooks.java:516)
    at org.milyn.Smooks.filterSource(Smooks.java:475)
    at testEdi.Main.runSmooksTransform(Main.java:61)
    at testEdi.Main.main(Main.java:78)
    Caused by: org.milyn.edisax.EDIParseException: EDI message processing failed [EDI][1.0]. Segment [C3] expected to contain 4 fields. Actually contains 1 fields (not including segment code). Currently at segment number 6.
    at org.milyn.edisax.EDIParser.assertFieldsOK(EDIParser.java:667)
    at org.milyn.edisax.EDIParser.mapFields(EDIParser.java:537)
    at org.milyn.edisax.EDIParser.mapSegment(EDIParser.java:516)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:481)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:488)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:411)
    at org.milyn.edisax.EDIParser.parse(EDIParser.java:387)
    at org.milyn.edisax.EDIParser.parse(EDIParser.java:347)
    at org.milyn.smooks.edi.EDIReader.parse(EDIReader.java:110)
    at org.milyn.delivery.dom.DOMParser.parse(DOMParser.java:146)
    at org.milyn.delivery.dom.DOMParser.parse(DOMParser.java:94)
    at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:290)
    ... 6 more

    請問下怎么解決呢?

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产精品无码久久98| 亚洲一区二区在线免费观看| 久久精品国产亚洲一区二区三区| 中文字幕在线免费观看视频| 亚洲精品高清国产麻豆专区| 四虎成人精品一区二区免费网站| 四虎影视久久久免费观看| 老色鬼久久亚洲AV综合| 国产在线a不卡免费视频| 一个人看的www免费视频在线观看| 亚洲看片无码在线视频| 亚洲色爱图小说专区| 亚洲欧洲免费无码| 成人网站免费大全日韩国产| 亚洲jjzzjjzz在线观看| AV在线播放日韩亚洲欧| 色婷婷7777免费视频在线观看 | 亚洲中文无码亚洲人成影院| 国产成人精品久久亚洲高清不卡 | 99re6免费视频| 全部一级一级毛片免费看| 亚洲第一永久在线观看| 亚洲综合精品网站在线观看| 免费毛片a在线观看67194| 你懂的网址免费国产| 亚洲日韩在线中文字幕综合| 亚洲国产夜色在线观看| 亚洲日韩激情无码一区| 免费h成人黄漫画嘿咻破解版| 中文字幕无码播放免费| 97人妻精品全国免费视频 | 亚洲国产精品成人精品无码区| 在线jlzzjlzz免费播放| 最近免费最新高清中文字幕韩国| 成人国产网站v片免费观看| 99亚偷拍自图区亚洲| 亚洲欧洲综合在线| 亚洲成AV人在线播放无码| 亚洲中文无韩国r级电影| 午夜小视频免费观看| 中文字幕影片免费在线观看 |