как обновить значение пространства имен ответа мыла с помощью wso2 ei

У меня есть прокси-служба для предоставления мыла 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 Неверный целевой объект для обогащения.

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

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

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


person Anushka Ekanayake    schedule 02.04.2019    source источник


Ответы (2)


Этого нельзя сделать с обогащающим посредником. Поскольку в коде, связанном с улучшенной обработкой цели посредника, [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>

We can refer this style sheet in the XSLT mediator before sending the response out from the EI. The new namespace will be added to the body.

person Thishani Lucas    schedule 02.04.2019
comment
все работает нормально, большое спасибо @Thishani Lucas - person Anushka Ekanayake; 03.04.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>
person Bee    schedule 02.04.2019
comment
Это изменит пространство имен конверта и сохранит тело. Однако пространство имен, которое необходимо изменить, находится в теле. - person ophychius; 02.04.2019
comment
Да, это не точный ответ. Вы можете изменить его, чтобы добиться желаемого. - person Bee; 02.04.2019