Apache camel camel smooks在body中返回null

Apache camel camel smooks在body中返回null,apache-camel,talend,edi,smooks,Apache Camel,Talend,Edi,Smooks,我正在使用talend ESB,并希望使用smooks将EDI消息解析为XML&我在正文中得到null。代码如下所示 from( "file://D:/cimt/InvoiceEDI_Mapping/" + "?noop=true" + "&autoCreate=true" + "&flatten=false" + "&fileName=InDev_EDI_Msg.txt" + "&bufferSize=128") .routeId("TestSm

我正在使用talend ESB,并希望使用smooks将EDI消息解析为XML&我在正文中得到null。代码如下所示

from(
"file://D:/cimt/InvoiceEDI_Mapping/" + "?noop=true"
    + "&autoCreate=true" + "&flatten=false"
    + "&fileName=InDev_EDI_Msg.txt" + "&bufferSize=128")
.routeId("TestSmooksConfig_cFile_1")
.log(org.apache.camel.LoggingLevel.WARN,
"TestSmooksConfig.cLog_1", "${body}")

.id("TestSmooksConfig_cLog_1")

.to("smooks://EDI_Config.xml")
.to("log:TestSmooksConfig.cLog_2" + "?level=WARN")

.id("TestSmooksConfig_cLog_2");
    }
我的Talend路线如下所示

from(
"file://D:/cimt/InvoiceEDI_Mapping/" + "?noop=true"
    + "&autoCreate=true" + "&flatten=false"
    + "&fileName=InDev_EDI_Msg.txt" + "&bufferSize=128")
.routeId("TestSmooksConfig_cFile_1")
.log(org.apache.camel.LoggingLevel.WARN,
"TestSmooksConfig.cLog_1", "${body}")

.id("TestSmooksConfig_cLog_1")

.to("smooks://EDI_Config.xml")
.to("log:TestSmooksConfig.cLog_2" + "?level=WARN")

.id("TestSmooksConfig_cLog_2");
    }

我使用了以下一组外部依赖项。 milyn-commons-1.7.0.jar milyn-smooks-camel-1.7.0.jar milyn-smooks-edi-1.7.0.jar milyn-smooks-core-1.7.0.jar jaxen-1.1.6.jar milyn-edisax-parser-1.4.jar

此外,我看到一个奇怪的行为,在执行时,我仍然看到在CJAVDSLProcessor之前“启动”,这让我开始怀疑它是否被执行。但后来,当我故意在EDI映射中出错时,路由抛出了错误,这让我确信它确实解析了EDI消息

在这里发布这个问题之前,我也进行了搜索,并在这篇文章中发现了类似的问题


我试图将org.milyn.*jars的修订版降低到1.4.0,但遇到了一个例外,路由无法注册smooks组件。因此,我继续使用org.milyn.*jars的1.7.0版本。

为了其他可能遇到类似问题的人的利益,我“假设”smooks的输出被写入StringResult.class类型的对象中。然而,在我的初始实现中,没有这样的选项,因此输出体为null

后来,我尝试了另一种使用processor endpoint的方法,实际上他们甚至声明可以通过exports元素检索数据。下面的代码片段帮助解决了这个问题

Smooks smooks = new Smooks("edi-to-xml-smooks-config.xml");
ExecutionContext context = smooks.createExecutionContext();
smooks.setExports(new Exports(StringResult.class));
SmooksProcessor processor = new SmooksProcessor(smooks, context);
from("file://input?noop=true")
.process(processor)
.to("mock:result");

虽然这回答了问题,但使用SmooksProcessor的一个缺点是头在交换中丢失并设置为null。