2016-07-07 35 views
0

我嘗試使用smooks(1.5.1)和wso2 esb的最新版本解析csv文件ang錯誤: java.lang.IllegalArgumentException:null或空'fields'方法調用中的arg。使用smooks解析csv文件返回錯誤null或空arg

我的CSV文件多記錄字段定義: 輸入.csv文件(帶標籤delimeted):

T11 T12 T13 T14 T15 T16 
T21 T22 T23 T24 T25 T26 
T3 

代理服務(只Smooks的配置部分:

<smooks config-key="smooks-config"> 
<input type="text"/> 
<output type="xml"/> 
</smooks> 

的Smooks配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<localEntry key="smooks-config" xmlns="http://ws.apache.org/ns/synapse"> 
    <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:csv="http://www.milyn.org/xsd/smooks/csv-1.5.xsd"> 
    <csv:reader fields="T11[*] | T22[*] | T3[*]" indent="true" 
     recordElementName="message" rootElementName="messages" separator="&#x9;"/> 
    </smooks-resource-list> 
</localEntry> 

結果我得到異常:

TID: [-1234] [ESB] [2016-07-07 15:33:16,742] DEBUG - Start : Smooks mediator {org.wso2.carbon.mediator.transform.SmooksMediator} 
TID: [-1234] [ESB] [2016-07-07 15:33:16,756] ERROR - Failed to filter source. {org.wso2.carbon.mediator.transform.SmooksMediator} 
org.milyn.SmooksException: Failed to filter source. 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:97) 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:64) 
    at org.milyn.Smooks._filter(Smooks.java:526) 
    at org.milyn.Smooks.filterSource(Smooks.java:482) 
    at org.wso2.carbon.mediator.transform.SmooksMediator.mediate(SmooksMediator.java:131) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:149) 
    at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:185) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.axis2.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:328) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.processFile(VFSTransportListener.java:751) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.scanFileOrDirectory(VFSTransportListener.java:407) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:177) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:124) 
    at org.apache.axis2.transport.base.AbstractPollingTransportListener$1$1.run(AbstractPollingTransportListener.java:67) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalArgumentException: null or empty 'fields' arg in method call. 
    at org.milyn.assertion.AssertArgument.isNotNullAndNotEmpty(AssertArgument.java:105) 
    at org.milyn.flatfile.Record.<init>(Record.java:43) 
    at org.milyn.flatfile.variablefield.VariableFieldRecordParser.nextRecord(VariableFieldRecordParser.java:201) 
    at org.milyn.flatfile.FlatFileReader.parse(FlatFileReader.java:176) 
    at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:76) 
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:86) 
    ... 19 more 
TID: [-1234] [ESB] [2016-07-07 15:33:16,763] ERROR - Failed to filter source. Caused by Failed to filter source. {org.apache.synapse.mediators.base.SequenceMediator} 
org.wso2.carbon.mediator.service.MediatorException: Failed to filter source. Caused by Failed to filter source. 
    at org.wso2.carbon.mediator.transform.SmooksMediator.handleException(SmooksMediator.java:252) 
    at org.wso2.carbon.mediator.transform.SmooksMediator.mediate(SmooksMediator.java:147) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:149) 
    at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:185) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.axis2.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:328) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.processFile(VFSTransportListener.java:751) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.scanFileOrDirectory(VFSTransportListener.java:407) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:177) 
    at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:124) 
    at org.apache.axis2.transport.base.AbstractPollingTransportListener$1$1.run(AbstractPollingTransportListener.java:67) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

我認爲這個問題是在「T3」行(如果我從CSV刪除此行 - 文件進行分析,但沒有額外的「recordElementName」)

由於提前

回答

0

字段在您的CVS閱讀器配置中的定義看起來不正確。

按照Smooks的1.5文檔:

Note the sytax in the 'fields' attribute. Each record definition is separated by the pipe character '|'. Each record definition is constructed as record-name[field-name,field- name]. record-name is matched against the first field in the incoming message and so used to select the appropriate recodr definition to be used for outputting that record. Also note how you can use an astrix character ('*') when you don't want to name the record fields. In this case (as when extra/unexpected fields are present in a record), the reader will generate the output field elements using a generated element name e.g. "field_0", "field_1" etc. See the "magazine" record in the previous example.

注意,記錄的名稱應該匹配針對該行的第一個字段。

我的理解是CVS讀者的配置應該是這樣在你的榜樣:通知

<csv:reader fields="T11[*] | T21[*] | T3[*]" indent="true" 
    recordElementName="message" rootElementName="messages" 
    separator="&#x9;"/> 

「T21 [*]」,而不是 「T22 [*]」

嘗試糾正和看看它是否修復你懷疑是T3問題。