月蝕傳說

          浮躁讓人失去理智
          posts - 25, comments - 101, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理

          Smooks 工具 - QuickStart

          Posted on 2009-08-24 19:00 Dart 閱讀(6608) 評(píng)論(2)  編輯  收藏 所屬分類: JBoss SOA 產(chǎn)品

          English Version

          Smooks Tools 是一個(gè)針對(duì)Smooks數(shù)據(jù)轉(zhuǎn)換平臺(tái)而開發(fā)的一個(gè)工具,整個(gè)工具是基于Eclipse的。


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


          本文將簡(jiǎn)要介紹一下Smooks configuration editor。


          Quick Start


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


          下載以及安裝


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

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

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


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


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


          完成后啟動(dòng)Eclipse,在菜單欄上選擇:Help -> About Eclipse SDK -> Installation Details -> Plug-ins ,在列表中我們會(huì)看到Smooks tools所對(duì)應(yīng)的3個(gè)plugin:

           

          這說明Smooks tools已經(jīng)安裝成功了。


          新建Smooks項(xiàng)目


          在eclipse中我們新建一個(gè)Java工程,在項(xiàng)目下新建一個(gè)libs文件夾,然后將所下載的Smooks 1.2.1中的libraries復(fù)制到該文件夾下,并將這些libraries加入到j(luò)ava項(xiàng)目的classpath當(dāng)中(右鍵點(diǎn)擊項(xiàng)目-> Properties -> Java Build Path -> Libraries -> Add JARs... )


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


          映射規(guī)則


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


          轉(zhuǎn)換輸入Java類example.sourcemodel.Order類,具有以下結(jié)構(gòu):

           

          1.Order類本身

          2.Order包含有一個(gè)Header類,以及一個(gè)List類

          3.Header類具有customerName,customerNumber,priority三個(gè)屬性

          4.List中將存放的是一個(gè)OrderItem類

          5.OrderItem具有price,productId,quantity三個(gè)屬性


          讓我們看看轉(zhuǎn)換目標(biāo)類LineOrder:



          該結(jié)構(gòu)為:

          1.LineOrder類包含有customerId,customerName,priority 三個(gè)屬性以及一個(gè)lineItems的數(shù)組。

          2.數(shù)據(jù)lineItems是由LineItem組成

          3.LineItem具有productCode,unitPrice,unitQuantity三個(gè)屬性。


          了解完轉(zhuǎn)換輸入以及轉(zhuǎn)換目標(biāo)的結(jié)構(gòu)后,我們將要以下列的規(guī)則來將轉(zhuǎn)換輸入映射到轉(zhuǎn)換目標(biāo)中:


          1.每一個(gè)Order類的實(shí)例對(duì)應(yīng)生成一個(gè)LineOrder的實(shí)例

          2.Order實(shí)例中Header的customerName值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerName

          3.Order實(shí)例中Header的customerNumber值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerId

          4.Order實(shí)例中Header的proiority值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的proiority

          5.每一個(gè)Order實(shí)例中的orderitems List的實(shí)例將對(duì)應(yīng)生成一個(gè)LineOrder中的lineItems數(shù)組對(duì)象,并且orderItem List中的OrderItem實(shí)例將會(huì)對(duì)應(yīng)生成一個(gè)LineItem對(duì)象,該LineItem的對(duì)象會(huì)被放置到生成的lineItems數(shù)組對(duì)象中。

          6.OrderItem實(shí)例中的productId值將賦值到對(duì)應(yīng)LineItem對(duì)象中的productCode

          7.OrderItem實(shí)例中的price值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitPrice

          8.OrderItem實(shí)例中的quantity值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitQuantity


          請(qǐng)仔細(xì)閱讀以上規(guī)則后進(jìn)入到下一節(jié)。


          新建Smooks configuration file


          我們選中所建項(xiàng)目的src文件夾,點(diǎn)右鍵,選擇New -> Other... -> Smooks -> Smooks Configuratin File.


           


          然后點(diǎn)擊Next > ,選擇所要生成smooks config file所在的文件夾,選擇到所生成項(xiàng)目的src下,然后點(diǎn)擊Finish完成配置文件的創(chuàng)建。


           


          我們將會(huì)看到新建的smooks conig file , 并且該文件自動(dòng)被Smooks Configuration Editor打開。


           


          添加輸入數(shù)據(jù)


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

          Overview, Reader , Message Filter ,Graph , Source


          首先第一步,我們需要將轉(zhuǎn)換輸入Order類添加進(jìn)來,點(diǎn)擊Reader tab,切換到Reader/Input編輯頁(yè)。


           

          在該編輯頁(yè)的下方,我們可以看到一個(gè)Input Data的列表,點(diǎn)擊該列表右側(cè)的Add按鈕,根據(jù)向?qū)В砑右粋€(gè)Java輸入:

           

           


          確定后點(diǎn)擊Finish,Order類將被作為輸入數(shù)據(jù)添加進(jìn)來。


          添加目標(biāo)Bean


          完成輸入數(shù)據(jù)的添加后,我們切換到Message Filter頁(yè)。

           

          點(diǎn)擊Add按鈕,將有一個(gè)向?qū)ы?yè)出現(xiàn)。


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


           

          這時(shí)我們會(huì)發(fā)現(xiàn)在Message Filter頁(yè)面中增加一個(gè)Bean v1.2項(xiàng),選中該項(xiàng),在頁(yè)面的右側(cè)將會(huì)顯示出它可配置的屬性:


           

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

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


          將這兩項(xiàng)值輸入完成后,我們點(diǎn)擊下方的Add Binding , 將會(huì)彈出一個(gè)對(duì)話框,讓我們選擇所有添加的Bean的綁定屬性:


           


          全選后點(diǎn)擊OK,我們會(huì)看到在左側(cè)的Bean元素下,會(huì)生成一組屬性綁定元素:

           

          我們按照上述方法,再生成一個(gè)數(shù)組Bean lineItems以及一個(gè)LineItem的Bean。


          這兩個(gè)Bean所對(duì)應(yīng)的Class以及Bean id 為:


          數(shù)組Bean ,BeanId : lineItems , Class : example.trgmodel.LineItem[]
          LineItem Bean , BeanId : lineItem , Class : example.trgmodel.LineItem


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

          完成后,分別使用Add Binding鍵,將對(duì)應(yīng)的綁定屬性都添加好。


          最后的結(jié)果如下:


           

          我們看到有很多小紅叉在這些Binding元素上,這是因?yàn)槲覀冞€沒有設(shè)置其對(duì)應(yīng)的源的Selector值。

          (溫馨小貼士:關(guān)于selector請(qǐng)到smooks.org上查看相關(guān)的描述)


          創(chuàng)建映射


          現(xiàn)在讓我們切換到Graph頁(yè)面,我們會(huì)看到一組圖形:


          現(xiàn)在我來對(duì)該圖做一個(gè)介紹:


          最左側(cè)沒有標(biāo)題的圖形是我們?cè)O(shè)定的Input Data,它是以樹形結(jié)構(gòu)的形式展現(xiàn)的。

          右側(cè)從上到下, Bean v1.2 這是我們?cè)贛essage Filter中添加的一個(gè)Bean v1.2 ,現(xiàn)在顯示在Graph頁(yè)中,它的子圖形是它所對(duì)應(yīng)的binding子項(xiàng)。請(qǐng)參照上一節(jié)。


          現(xiàn)在我們可以試著選中最左側(cè)的圖形的根節(jié)點(diǎn)“Order”,然后拖拽它,我們會(huì)發(fā)現(xiàn)會(huì)有一根線出現(xiàn)。我們將它拖拽到Bean v1.2 (lineOrder)上后釋放,在這兩個(gè)圖形中出現(xiàn)了一條線。


          這條線表示:Order 實(shí)例將會(huì)根據(jù)Bean v1.2 (lineOrder)中所描述的class,對(duì)應(yīng)生成一個(gè)實(shí)例。我們?cè)谇皫讉€(gè)章節(jié)“映射規(guī)則” 中已經(jīng)說明了。


          現(xiàn)在我們根據(jù)映射規(guī)則,將輸入圖形對(duì)應(yīng)的點(diǎn)映射到Bean對(duì)應(yīng)的圖形上:


          1.每一個(gè)Order類的實(shí)例對(duì)應(yīng)生成一個(gè)LineOrder的實(shí)例

             操作:將order點(diǎn)連接到lineOrder上


          2.Order實(shí)例中Header的customerName值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerName

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


          3.Order實(shí)例中Header的customerNumber值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的customerId

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


          4.Order實(shí)例中Header的proiority值將賦值到對(duì)應(yīng)LineOrder實(shí)例中的proiority

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


          5.每一個(gè)Order實(shí)例中的orderitems List的實(shí)例將對(duì)應(yīng)生成一個(gè)LineOrder中的lineItems數(shù)組對(duì)象,并且orderItem List中的OrderItem實(shí)例將會(huì)對(duì)應(yīng)生成一個(gè)LineItem對(duì)象,該LineItem的對(duì)象會(huì)被放置到生成的lineItems數(shù)組對(duì)象中。

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


          6.OrderItem實(shí)例中的productId值將賦值到對(duì)應(yīng)LineItem對(duì)象中的productCode

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


          7.OrderItem實(shí)例中的price值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitPrice

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


          8.OrderItem實(shí)例中的quantity值將賦值到對(duì)應(yīng)LineItem對(duì)象中的unitQuantity

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


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


           

          在這里,我們需要回到Message Filter頁(yè)面,選中Bean v1.2 (lineItems)節(jié)點(diǎn),將它的property值刪除,因?yàn)樗鶎?duì)應(yīng)的是數(shù)組,所以不應(yīng)該具有property值。


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


          切換到Message Filter頁(yè),我們需要對(duì)一些屬性的類型進(jìn)行一些映射。

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

          2.lineItem.unitQuantity , 險(xiǎn)種該元素,在她的Decoder中輸入Integer

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

          對(duì)應(yīng)的Name和Value分別是:

          enumType :example.trgmodel.LineOrderPriority


          LOW :NOT_IMPORTANT


          MEDIUM : IMPORTANT


          HIGH:VERY_IMPORTANT


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


          運(yùn)行轉(zhuǎn)換測(cè)試


          先下載Main類,然后放到項(xiàng)目中,運(yùn)行該類,測(cè)試轉(zhuǎn)換是否成功。


          評(píng)論

          # re: Smooks 工具 - QuickStart  回復(fù)  更多評(píng)論   

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

          # re: Smooks 工具 - QuickStart  回復(fù)  更多評(píng)論   

          2014-08-20 12:24 by lgm
          我有個(gè)問題想問下:
          我有個(gè)xml文件是全量字段的C3有4個(gè)字段,但是我實(shí)際報(bào)文中只傳了1個(gè)參數(shù),
          運(yùn)行時(shí)就會(huì)報(bào)錯(cuò)
          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

          請(qǐng)問下怎么解決呢?

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 浮山县| 元朗区| 张家界市| 平舆县| 萍乡市| 哈巴河县| 武宁县| 杭锦旗| 临沭县| 会理县| 青海省| 通州区| 桓仁| 广平县| 花莲市| 榆社县| 冀州市| 张家口市| 闽侯县| 霍州市| 祥云县| 长宁县| 万安县| 太和县| 辉南县| 海淀区| 贵港市| 伊金霍洛旗| 襄垣县| 库车县| 色达县| 南京市| 双牌县| 太保市| 青浦区| 平原县| 茂名市| 庄浪县| 海淀区| 故城县| 饶阳县|