2014-12-31 29 views
3

我遇到了麻烦,它处理来自WSO2 ESB(4.8.1)代理服务中REST API的纯XML响应。我的outSequence显然将API调用结果有效载荷预期成为一个SOAP消息,它不是(纯XML),在进一步处理它时会导致错误。我使用HTTP端点,但使用地址端点时发生相同的错误。我不得不使用GET作为请求方法,因为API不允许POX。 (这个问题似乎是类似于WSO2 ESB: log and convert response from the RDF REST service back to SOAP已经提到的但它似乎并没有被固定在ESB 4.8.1和我'无法使用变通提到有)WSO2 ESB:WSO2 REST API调用中的XML响应未解析

这里是我的终点:

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="Alfresco_login"> 
    <http uri-template="http://localhost:8080/alfresco/service/api/login?u={query.param.name}&pw={query.param.password}" method="get"></http> 
</endpoint> 

这里是代理:

<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="Alfresco_proxy" 
     transports="https,http"> 
    <target endpoint="Alfresco_login"> 
     <inSequence> 
     <property name="query.param.name" value="XXX"/> 
     <property name="query.param.password" value="XXX"/> 
     </inSequence> 
     <outSequence> 
     <log/> 
     <send/> 
     </outSequence>`enter code here` 
    </target> 
    <description/> 
</proxy> 

这是我从API得到的回应:

<?xml version="1.0" encoding="UTF-8"?> 
<ticket>TICKET_605cbf0977db895db9bbc6e5eb6d4dba75454cc4</ticket> 

这我得到的错误,一旦我尝试登录响应:这里

ERROR_EXCEPTION : org.apache.synapse.SynapseException: Error while building message 
ERROR_DETAIL : org.apache.synapse.SynapseException: Error while building message at org.apache.synapse.mediators.AbstractMediator.handleException(AbstractMediator.java:313) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47) at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131) at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:268) at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:488) at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:170) at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:225) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.axis2.AxisFault: Error while building Passthrough stream at org.apache.synapse.transport.passthru.util.RelayUtils.handleException(RelayUtils.java:236) at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:111) at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:82) at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:68) ... 11 more Caused by: org.apache.axiom.soap.SOAPProcessingException: First Element must contain the local name, Envelope , but found ticket at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.constructNode(StAXSOAPModelBuilder.java:305) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createOMElement(StAXSOAPModelBuilder.java:252) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createNextOMElement(StAXSOAPModelBuilder.java:234) at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:249) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.getSOAPEnvelope(StAXSOAPModelBuilder.java:204) at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.<init>(StAXSOAPModelBuilder.java:154) at org.apache.axiom.om.impl.AbstractOMMetaFactory.createStAXSOAPModelBuilder(AbstractOMMetaFactory.java:73) at org.apache.axiom.om.impl.AbstractOMMetaFactory.createSOAPModelBuilder(AbstractOMMetaFactory.java:79) at org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(OMXMLBuilderFactory.java:196) at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:55) at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:118) at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:107) ... 13 more 

任何人都找到了这样的定位?

回答

5

最终,主要问题出现在适当的MessageBuilder配置中。只要服务响应是一个简单的XML,并且它被标记在响应头中,那么WSO2就会将它传递给客户端。一旦响应被标记为不同 - 在我的情况下,它是application/atom + xml,默认的MessageBuilder没有应用,因此WSO2期望contnent是SOAP。我在\ repository \ conf \ axis2 \ axis2.xml中添加了一个构建器配置:

<messageBuilder class="org.apache.axis2.builder.ApplicationXMLBuilder" contentType="application/atom+xml"/> 

现在工作正常。

请参阅https://docs.wso2.com/display/ESB480/Working+with+Message+Builders+and+Formattershttps://docs.wso2.com/display/ESB402/Message+Relay+Building+Blocks