问题描述
我需要调用外部 REST 服务,该服务将响应作为 json 返回,并将响应写入 CSV 文件。我正在使用 WSO2 Smooks 中介进行转换。我能够在代理服务序列中使用硬编码的 xml 负载来实现这一点,但是当我切换到调用外部服务时,我遇到了一些问题。
来自外部服务的响应如下:
[
{
"name": "aaaa","city": "CL","age": "33"
},{
"name": "bbbb","city": "KD","age": "21"
},{
"name": "ccc","city": "GL","age": "14"
},{
"name": "dddd","city": "NE","age": "45"
}
]
smooks 配置
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">
<params>
<param name="stream.filter.type">SAX</param>
<param name="default.serialization.on">true</param>
</params>
<json:reader rootName="json" keyWhitspaceReplacement="_">
<json:keyMap>
<json:key from="date&time" to="date_and_time" />
</json:keyMap>
</json:reader>
<resource-config selector="json">
<resource>org.milyn.delivery.DomModelCreator</resource>
</resource-config>
<ftl:freemarker applyOnElement="json">
<ftl:template>
<!--
<#ftl ns_prefixes={"D":"http://ws.apache.org/ns/synapse"}>${json.name},${json.city},${json.age}
-->
</ftl:template>
<param name="quote">"</param>
<param name="includeFieldNames">true</param>
<param name="csvFields">name,city,age</param>
<param name="seperator">,</param>
<param name="messageType">CSV</param>
<param name="templateDataProvider">input</param>
</ftl:freemarker>
</smooks-resource-list>
代理服务代码段
<inSequence>
<log level="full">
<property name="STATUS" value="Calling external service.."/>
</log>
<call>
<endpoint>
<http method="GET" uri-template="http://demo8466012.mockable.io/simpleuserdata"/>
</endpoint>
</call>
<log level="full"/>
<smooks config-key="conf:/smooks-csv-config.xml">
<input type="xml"/>
<output type="text"/>
</smooks>
<log level="custom">
<property name="STATUS" value="PROCESSED MSG******"/>
</log>
<log level="full"/>
<property name="OUT_ONLY" value="true"/>
<property name="messageType" scope="axis2" value="plain/text"/>
<property name="ContentType" scope="axis2" value="plain/text"/>
<log level="full">
<property expression="//*[local-name() = 'text']/text()" name="inputContent"/>
</log>
<property expression="//*[local-name() = 'text']/text()" name="inputContent"/>
<!-- Write to CSV using a class mediator or file connector -->
</inSequence>
我想不出正确的方法来编写 smooks 配置,我相信根本原因就在那里。这是我得到的错误。
[2021-06-08 01:29:14,345] ERROR {org.apache.synapse.registry.AbstractRegistry} - Error reading registry resource file : conf:/smooks-csv-config.xml org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "json"
at [row,col {unkNown-source}]: [10,65]
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
at org.apache.axiom.om.impl.llom.OMSerializableImpl.build(OMSerializableImpl.java:78)
at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:722)
at org.apache.axiom.om.impl.llom.OMElementImpl.detach(OMElementImpl.java:700)
at org.wso2.carbon.mediation.registry.WSO2Registry.lookup(WSO2Registry.java:198)
at org.apache.synapse.registry.AbstractRegistry.getResource(AbstractRegistry.java:66)
at org.apache.synapse.config.SynapseConfiguration.getEntry(SynapseConfiguration.java:867)
at org.apache.synapse.core.axis2.Axis2MessageContext.getEntry(Axis2MessageContext.java:260)
at org.wso2.carbon.mediator.transform.SmooksMediator.createSmooksConfig(SmooksMediator.java:209)
at org.wso2.carbon.mediator.transform.SmooksMediator.mediate(SmooksMediator.java:104)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:260)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:807)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:305)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:578)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:195)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:284)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "json"
at [row,65]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
at com.ctc.wstx.sr.InputElementStack.resolveAndValidateElement(InputElementStack.java:507)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2977)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2837)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
... 21 more
感谢有人能指出确切的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)