0
votes

I have a requirement to invoke an external REST service, which returns the response as a json, and write the response to a CSV file. I'm using WSO2 Smooks mediator for the conversion. I was able to get that working with a hardcoded xml payload in a proxy service insequence, but when I switch to calling the external service, I ran into some issues.

Response from external service is as follows:

[
 {
 "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-config

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

Proxy service snippet

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

I couldn't figure out a correct way to write the smooks config I believe root cause is there. This is the error I'm getting.

[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,col {unknown-source}]: [10,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

Appreciate if someone can point out the exact issue.

1

1 Answers

0
votes

You are missing the JSON namespace declaration.

xmlns:json = "http://www.milyn.org/xsd/smooks/json-1.2.xsd"