2011-11-02 35 views
3

我目前正在評估smooks(www.smooks.org)。它看起來就像我們需要的東西,但是我有一個簡單的例子來工作有問題。斯莫克的問題

我有一個ant腳本,下載我所有的依賴項,包括EDIFACT消息的映射和綁定罐。

我想使用他們的EJC(我正在使用JavaSE進行這個小測試)將簡單的EDIFACT APERAK消息轉換爲Java。 轉換失敗,但有一個例外情況是預計不需要某個塊(請參閱下文)。所以我想知道我是否缺少一些配置(請注意日誌輸出中的前幾行)。

有沒有人與Smooks的EJC合作?我怎樣才能獲得更多關於它在抱怨的信息?

所以這是代碼:

D00BInterchangeFactory factory = D00BInterchangeFactory.getInstance(); 
    File file = new File("aperak.edi"); 
    BufferedInputStream ediSource = new BufferedInputStream(new FileInputStream(file)); 
    StreamResult xmlStream = new StreamResult(); 
    StringWriter xmlWriter = new StringWriter(); 
    xmlStream.setWriter(xmlWriter); 
    UNEdifactInterchange interchange = factory.fromUNEdifact(ediSource); 
    //System.err.println("MEssage "+xmlWriter.toString()); 
    if(interchange instanceof UNEdifactInterchange41){ 
     UNEdifactInterchange41 interchange41 = (UNEdifactInterchange41)interchange; 
     for(UNEdifactMessage41 message: interchange41.getMessages()){ 
     Object messageObj = message.getMessage(); 
      System.err.println("Ref Num "+message.getMessageHeader().getMessageRefNum()); 
     if(messageObj instanceof Aperak){ 
      Aperak aperak = (Aperak)message.getMessage(); 
      System.err.println("Aperak "+aperak); 
      } 
     } 
    } 

當我運行它,我得到這個例外

02-Nov-2011 15:58:09 org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy addCDU 
WARNING: ContentHandlerFactory [org.milyn.delivery.JavaContentHandlerFactory] unable to create resource processing instance for resource [Target Profile: [[*]], Selector: [cdu-creator], Selector Namespace URI: [null], Resource: [org.milyn.smooks.scripting.groovy.GroovyContentHandlerFactory], Num Params: [1]]. org/codehaus/groovy/control/CompilationFailedException 
02-Nov-2011 15:58:10 org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy addCDU 
WARNING: ContentHandlerFactory [org.milyn.delivery.JavaContentHandlerFactory] unable to create resource processing instance for resource [Target Profile: [[*]], Selector: [cdu-creator], Selector Namespace URI: [null], Resource: [org.milyn.smooks.scripting.groovy.GroovyContentHandlerFactory], Num Params: [1]]. org/codehaus/groovy/control/CompilationFailedException 
Exception in thread "main" org.milyn.SmooksException: Failed to filter source. 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:86) 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:61) 
    at org.milyn.Smooks._filter(Smooks.java:516) 
    at org.milyn.Smooks.filterSource(Smooks.java:475) 
    at org.milyn.Smooks.filterSource(Smooks.java:449) 
    at org.milyn.edi.unedifact.d00b.D00BInterchangeFactory.fromUNEdifact(D00BInterchangeFactory.java:58) 
    at org.milyn.edi.unedifact.d00b.D00BInterchangeFactory.fromUNEdifact(D00BInterchangeFactory.java:40) 
    at EDITestReader.readFile(EDITestReader.java:37) 
    at EDITestReader.main(EDITestReader.java:59) 
Caused by: org.xml.sax.SAXException: Unknown/Unexpected UN/EDIFACT control block segment code ' 
UN'. 
    at org.milyn.edisax.unedifact.handlers.r41.UNEdifact41ControlBlockHandlerFactory.getControlBlockHandler(UNEdifact41ControlBlockHandlerFactory.java:53) 
    at org.milyn.edisax.unedifact.UNEdifactInterchangeParser.parse(UNEdifactInterchangeParser.java:95) 
    at org.milyn.smooks.edi.unedifact.UNEdifactReader.parse(UNEdifactReader.java:77) 
    at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:70) 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:75) 
    ... 8 more 
    enter code here 

實際EDIFACT消息相當簡單:

UNA:+.? ' 
UNB+UNOC:3+IMP+XXX+20110902:1024+44090560' 
UNH+440905601+APERAK:D:00B:UN:IMP10' 
BGM+313++9+RE' 
RFF+ACW:XXXXXXXXX1109020' 
DTM+182:201109021018:203' 
RFF+BM:XXXXXXXXX' 
RFF+AGO:XXXXXXX1109020' 
RFF+EQ:XXXXXXXX' 
NAD+MS+IMP' 
CTA+MS+:EDI' 
COM+XXXXXXXXXXX:TE' 
[email protected]:EM' 
ERC+200:IMP02:DAK' 
FTX+AAO+++ERR4045?: Gest.datum ist mehr als 90 Tage kleiner als das Tagesdatum+DE' 
UNT+14+440905601' 
UNZ+1+44090560' 

當我刪除領先的UNA和UNB細分市場會產生這樣的例外:([APERAK] [D:00B:UN]。必須至少有1個細胞碎片t [BGM])。有一個背景音樂段,所以我不知道它爲什麼抱怨。

Caused by: org.milyn.edisax.EDIParseException: EDI message processing failed [APERAK][D:00B:UN]. Must be a minimum of 1 instances of segment [BGM]. Currently at segment number 2. 
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:460) 
    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:371) 
    at org.milyn.edisax.unedifact.handlers.r41.UNHHandler.process(UNHHandler.java:80) 
    at org.milyn.edisax.unedifact.UNEdifactInterchangeParser.parse(UNEdifactInterchangeParser.java:98) 
    at org.milyn.smooks.edi.unedifact.UNEdifactReader.parse(UNEdifactReader.java:77) 
    at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:70) 

UPDATE: 當我從消息

UNH+440905601+APERAK:D:00B:UN:IMP10'BGM+313++9+RE'RFF+ACW:XXXXXXXXX1109020'DTM+182:201109021018:203' 

刪除回車它工作正常。但是,我怎樣才能接受回車和空白區以及UNA/UNB這兩個主要領域?我可能跳過了正常情況下的一部分消息處理。

更新2: 想通過UNA/UNB段支持(我的錯誤),但我仍然有回車問題。 Renat建議在EDIParser上使用'ignoreNewLines'選項。我已經嘗試過,但似乎沒有什麼區別。我也嘗試用此配置smooks:

<?xml version="1.0" encoding="UTF-8"?> 
    <smooks-resource-list 
    xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" 
    xmlns:edi="http://www.milyn.org/xsd/smooks/edi-1.4.xsd"> 
     <edi:reader mappingModel="/org/milyn/smooks/edi/xsd14/edi-to-xml-mapping.xml" ignoreNewLines="true" /> 
    </smooks-resource-list> 

再次沒有成功。

我感覺D00AInterchangeFactory(或者你使用的每個版本)配置它的EDIParser的方式不同,忽略忽略NewLines。

有沒有辦法讓EDIParser InterchangeFactory使用?

回答

2

您需要在EDIParser上添加enable'ignore new line'開關。 你有多種方式來做到這一點,例如,你可以使用的XMLReader#setFeature()

http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html#setFeature(java.lang.String,%20boolean

或直接通過EDIParser方法調用。看到這裏樣本

https://gist.github.com/825845

這裏

https://gist.github.com/825843

長Renat

+0

長Renat您好,感謝您的回答。我試過了ignoreNewLines選項,但它似乎不適用於EJC生成的InterchnageFactory類。我嘗試通過smooks-config.xml()將其設置爲smooks對象上的GenericReaderConfigurator。由於我不直接使用EDIParser,因此無法設置任何內容。看來UNEdifactInterchangeFactory創建自己的EDIParser並忽略ignoreNewLines選項。 – Ben

+0

您可以做的是更改生成的代碼,或更實用的方法複製生成的D00BInterchangeFactory類並在您的項目中進行更改。一旦它可以工作,您可以爲Smooks JIRA項目提交錯誤,如果您想要,您可以直接在EJC中爲用於代碼生成的速度模板進行分隔和修補,所以稍後我們將使請求修復爲EJC代碼。 – Renat

+0

我們還使用smooks解析Karaf容器內的EDIFACT。我們注意到在將日誌級別提升到DEBUG後重新處理失敗的訂單使得訂單通過。我們在CSVReader中也觀察到了這種行爲。 – ieugen