简体   繁体   中英

Parsing csv file using smooks returns error null or empty arg

i try to parse csv file using latest release of smooks(1.5.1) and wso2 esb ang get error: java.lang.IllegalArgumentException: null or empty 'fields' arg in method call.

My csv file has Multi Record Field Definitions: Input .csv file(delimeted with tab):

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

Proxy Service(only part with smooks config:

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

Smooks configuration file:

<?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>

And in result i get exception:

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)

I thinks the problem is in "T3" line(if i remove this line from csv - file is parsed, but without additional "recordElementName")

Thanks in Advance

The fields definition in your cvs reader config does not look correct.

According to the Smooks 1.5 documentation:

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 eg "field_0", "field_1" etc. See the "magazine" record in the previous example.

Notice that the record-name is supposed to match against the first field in the row.

My understanding is the cvs reader config should be something like this in your example:

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

Notice "T21[*]" instead of "T22[*]"

Try correcting that and see if it fixes what you suspect is a T3 problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM