как обновить значение пространства имен мыльного ответа с помощью wso2 ei - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть прокси-служба для предоставления SOAP API на wso2 ei, и мне нужно обновить значение пространства имен ответа мыла с помощью моей прокси-службы и вернуть другое значение пространства имен. Я попытался с обогащением медиатора следующим образом в следующем.

<property name="namespace"
               scope="default"
               type="STRING"
               value="http://tempuri-updated.org/"/>
      <enrich>
        <source clone="false" property="namespace" type="property"/>
        <target xmlns:ser="http://services.samples"
                xmlns:ns="http://org.apache.synapse/xsd"
                xpath="namespace-uri($body/*)/text()"/>
     </enrich>

Я получаю эту ошибку.

ОШИБКА - EnrichMediator Invalid Целевой объект для обогащения.

мой действительный ответ мыла выглядит следующим образом

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>

мой ожидаемый результат выглядит следующим образом

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AddResponse xmlns="http://tempuri-updated.org/">
         <AddResult>12</AddResult>
      </AddResponse>
   </soap:Body>
</soap:Envelope>

Все ваши отзывы приветствуются

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Этого нельзя сделать с помощью посредника обогащения. Поскольку в коде, связанном с обработкой целевых объектов обогащения [1] , анализируемый результат выражения xpath должен быть одним из SOAPHeaderImpl, OMElement, OMText или OMAttribute. Поскольку namespace-uri () просто возвращает строковое значение, обогащаемая цель становится недействительной. В качестве альтернативы этому варианту использования мы можем выполнить преобразование XSLT с помощью посредника XSLT. Ниже приведен пример таблицы стилей XSL, которую я пробовал.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@* | comment() | processing-instruction()">
    <xsl:copy/>
    </xsl:template>

   <xsl:template match="*">
       <xsl:element name="{local-name()}"
             namespace="http://tempuri-updated.org/">
       <xsl:apply-templates select="@* | node()"/>
       </xsl:element>
    </xsl:template>

Мы можем ссылаться на эту таблицу стилей в посреднике XSLT перед отправкой ответа из EI. Новое пространство имен будет добавлено в тело.

0 голосов
/ 02 апреля 2019

Попробуйте это.

http://codertechblog.com/wso2-change-payload-soap-envelope-namespace/

<sequence name="seTestChangeNamespace" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
(...)
<enrich>
<source type="body"/>
<target type="property" property="INPUT_MESSAGE"/>
</enrich>
<enrich>
<source type="inline">
<myns:Envelope xmlns:myns="http://schemas.xmlsoap.org/soap/envelope/">
<myns:Body/>
</myns:Envelope>
</source>
<target type="envelope"/>
</enrich>
<enrich>
<source type="property" property="INPUT_MESSAGE"/>
<target type="body"/>
</enrich>
(...)
</sequence>
...