0

我有这种情况:

我使用来自数据服务的一些信息和来自另一个数据服务的另一个信息,我想将这两个信息合并到一个唯一的响应中。

在这个测试中,我不使用数据服务,我在 SOAPUI 中使用模拟服务,两个模拟服务分别工作正常。

我要合并的数据,一个例子:

数据服务 1 响应:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:obt="http://informatizacion.uci.cu/servicios/assets/ObtenerPersonas">
   <soap:Header/>
   <soap:Body>
      <obt:Personas>
         <!--Zero or more repetitions:-->
         <obt:Persona>
            <obt:idExpediente>T123654</obt:idExpediente>
            <obt:primerNombre>yanaka</obt:primerNombre>
            <obt:primerApellido>perez</obt:primerApellido>
            <obt:segundoApellido>perez</obt:segundoApellido>
            <obt:sexo>F</obt:sexo>
            <obt:ci>920125848</obt:ci>
            <obt:provincia>ok</obt:provincia>
            <obt:municipio>yes</obt:municipio>
            <obt:area>facultad</obt:area>
            <obt:esDocente>false</obt:esDocente>
         </obt:Persona>
      </obt:Personas>
   </soap:Body>
</soap:Envelope>

数据服务 2 响应:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:preg="http://pregrado.uci.cu">
   <soap:Header/>
   <soap:Body>
      <preg:Personas>
         <!--Zero or more repetitions:-->
         <preg:Persona>
            <preg:idExpediente>11111</preg:idExpediente>
            <preg:primerNombre>jorge</preg:primerNombre>
            <preg:primerApellido>infante</preg:primerApellido>
            <preg:segundoApellido>osorio</preg:segundoApellido>
            <preg:sexo>M</preg:sexo>
            <preg:ci>1221122112211221</preg:ci>
            <preg:provincia>rdf</preg:provincia>
            <preg:municipio>dsf</preg:municipio>
            <preg:area>df</preg:area>
            <preg:esDocente>true</preg:esDocente>
         </preg:Persona>
         <preg:Persona>
            <preg:idExpediente>gero et</preg:idExpediente>
            <preg:primerNombre>sonoras imperio</preg:primerNombre>
            <preg:primerApellido>quae divum incedo</preg:primerApellido>
            <preg:segundoApellido>verrantque per auras</preg:segundoApellido>
            <preg:sexo>per auras</preg:sexo>
            <preg:ci>circum claustra</preg:ci>
            <preg:provincia>nimborum in</preg:provincia>
            <preg:municipio>foedere certo</preg:municipio>
            <preg:area>profundum quippe ferant</preg:area>
            <preg:esDocente>false</preg:esDocente>
         </preg:Persona>
      </preg:Personas>
   </soap:Body>
</soap:Envelope>

所以我建立了这个代理服务:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="PersonaPoC"
transports="https,http" statistics="disable" trace="disable"
startOnLoad="true">
   <target inSequence="conf:/PersonaPoC/obtener_estudiantes"/>
   <publishWSDL key="conf:/wsdl/PersonaSimplev2.wsdl"/>
   <description></description>
</proxy>

使用此序列:

名称:obtener_estudiantes。

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <payloadFactory>
      <format>
         <preg:ObtenerEstudiantesPoC xmlns:preg="http://pregrado.uci.cu"/>
      </format>
   </payloadFactory>
   <send receive="conf:/PersonaPoC/guardar_Estudiantes">
      <endpoint>
         <address uri="http://destrono:8088/mockPregradoWSSOAP12Binding/"/>
      </endpoint>
   </send>
</sequence>

名称:guardar_Estudiantes。

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <enrich>
      <source clone="false" type="body"/>
      <target action="replace" type="property"
property="listado_estudiantes"/>
   </enrich>
   <payloadFactory>
      <format>
         <obt:ObtenerPersonasPoC
xmlns:obt="http://informatizacion.uci.cu/servicios/assets/ObtenerPersonas"/>
      </format>
   </payloadFactory>
   <log level="full"/>
   <send receive="conf:/PersonaPoC/unir_Personas">
      <endpoint>
         <address uri="http://destrono:8888/mockAssetsSOAP12Binding"/>
      </endpoint>
   </send>
</sequence>

此时我在执行服务时在 ESB 中看到此错误:

这是发送到第二个服务 mockAssetsSOAP12Binding 的消息日志。我不知道为什么会在请求中出现这个命名空间:xmlns:preg= http://pregrado.uci.cu ,因为我没有在 payloadfactory 调解器中使用它。

[2013-04-10 20:17:17,303]  INFO - LogMediator To:
http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: ,
MessageID: urn:uuid:26b0c552-d8e6-4285-8814-84c595dae544, Direction:
response, Envelope: 
<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:preg="http://pregrado.uci.cu">
      <soap:Body>
         <obt:ObtenerPersonasPoC
xmlns:obt="http://informatizacion.uci.cu/servicios/assets/ObtenerPersonas"/>
      </soap:Body>
</soap:Envelope>

错误:

[2013-04-10 19:49:30,472] ERROR - RelayUtils Error while building Passthrough stream
org.apache.axiom.soap.SOAPProcessingException: Transport level information does not match with SOAP Message namespace URI
        at
org.apache.axis2.builder.BuilderUtil.validateSOAPVersion(BuilderUtil.java:77
4)
        at
org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:58)
        at
org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocumen
t(DeferredMessageBuilder.java:146)
        at
org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUti
ls.java:150)
        at
org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtil
s.java:91)
        at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediat
or.java:62)
        at
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.
java:114)
        at
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2Syn
apseEnvironment.java:223)
        at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseC
allbackReceiver.java:443)
        at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbac
kReceiver.java:166)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at
org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:217
)
        at
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerP
ool.java:172)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:11
10)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:6
03)
        at java.lang.Thread.run(Thread.java:722)

当我在 AS 5.1.0 中使用数据服务时,我看到了这个错误:org.apache.axiom.soap.SOAPProcessingException: First Element must contain the local name, Envelope , but found faultstring

如果我把 TCPMon 我可以看到这个消息交换:

Incoming message:
POST /mockAssetsSOAP12Binding HTTP/1.1
Content-Encoding: gzip
Content-Type: application/soap+xml; charset=UTF-8
Server: Jetty(6.1.x)
Transfer-Encoding: chunked
Host: 127.0.0.1:8888
Connection: Keep-Alive

124
<?xml version='1.0' encoding='UTF-8'?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:preg="http://pregrado.uci.cu"><soap:Body>

   <obt:ObtenerPersonasPoC
xmlns:obt="http://informatizacion.uci.cu/servicios/assets/ObtenerPersonas"/>
</soap:Body></soap:Envelope>
0

传出消息:

HTTP/1.1 500 Internal Server Error
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Server: Jetty(6.1.x)

1a0
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <soap:Fault>
      <soap:Code>
        <soap:Value>Server</soap:Value>
      </soap:Code>
      <soap:Reason>
        <!--1 or more repetitions:-->
        <soap:Text xml:lang="en">java.io.IOException: Decompression of response failed</soap:Text>
      </soap:Reason>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>
0

这是最后一个序列。名称:unir_Personas。

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <enrich>
      <source clone="false" type="body"/>
      <target action=" sibling" type="property"
property="listado_estudiantes"/>
   </enrich>
   <send/>
</sequence>

任何想法?

4

1 回答 1

0

I don´t know why appear this namespace: xmlns:preg=http://pregrado.uci.cu in the request because I don´t used it in the payloadfactory mediator.

You might get that from your endpoint's response. You are using payload only for body and that particular namespace appears at rootlevel. Anyway, that is not the cause for the issue you are facing. In the middle you mentioned about SOAP12 service . Check the namespace is right, and if your endpoint accepts SOAP 12 requests, change the endpoint format to soap12

于 2013-06-10T16:29:05.650 回答