【问题标题】:Parsing csv file using smooks returns error null or empty arg使用 smooks 解析 csv 文件返回错误 null 或空 arg
【发布时间】:2016-07-07 13:06:24
【问题描述】:

我尝试使用最新版本的 smooks(1.5.1) 解析 csv 文件,但 wso2 esb 出现错误: java.lang.IllegalArgumentException:方法调用中的 null 或空 'fields' arg。

我的 csv 文件具有多记录字段定义: 输入 .csv 文件(以制表符分隔):

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”)

提前致谢

【问题讨论】:

    标签: java csv wso2esb smooks


    【解决方案1】:

    您的 cvs 阅读器配置中的字段定义看起来不正确。

    根据 Smooks 1.5 文档:

    注意“字段”属性中的语法。每个记录定义由竖线字符“|”分隔。每个记录定义构造为记录名称[字段名称,字段名称]。 记录名称与传入消息中的第一个字段相匹配,因此用于选择适当的记录器定义以用于输出该记录。另请注意,当您不想命名记录字段时,如何使用星号字符 ('*')。在这种情况下(当记录中存在额外/意外字段时),阅读器将使用生成的元素名称生成输出字段元素,例如“field_0”、“field_1”等。参见上例中的“杂志”记录。

    请注意,记录名称应该与行中的第一个字段匹配。

    我的理解是 cvs 阅读器配置在您的示例中应该是这样的:

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

    注意“T21[*]”而不是“T22[*]”

    尝试纠正它,看看它是否能解决您怀疑的 T3 问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多