WSO2 使用 JSON 输入 Smooks 中介

问题描述

我需要调用外部 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&amp;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 (将#修改为@)