sábado, 2 de febrero de 2019

WSO2 Mediator Tutorial: Como evitar incluir namespace con enrich

Ya vimos hace poco la diferencia del enrich y el payload como mediators en WSO2, aquí. Con Payload al sustituir el body teniamos un mayor control de la salida del mismo. Con enrich podemos modificar la respuesta remplazando un valor o añadiendo un hijo/hermano.

Partiendo del ejemplo anterior, podemos indicar que la respuesta recibida en formato XML a través del siguiente código:

<property name="messageType" value="text/xml" scope="axis2"/>

Y será el Enterprise Integrator el encargado de transformalo correctamente gracias a los Message formatter. Y por lo tanto la nueva salida de nuestro método será la siguiente:

<jsonObject>
    <bookstore>
        <name>the starts my destination</name>
        <author>Alfred Bester</author>
    </bookstore>
    <description xmlns="http://ws.apache.org/ns/synapse">list of books</description>
    <bookstore>
        <name>Ender's Game</name>
        <author>Orson S. Card</author>
    </bookstore>
    <total xmlns="http://ws.apache.org/ns/synapse">2</total>
</jsonObject>

Aparte de que al recibir originalmente la respuesta como un json y aunque transforma dicha respuesta a XML la incluye dentro del nodo 'jsonObject'. Podemos ver como aquellos nodos que hemos incluido como hermano o hijo se han creado con un namespace por defecto.

En algunos casos esto puede darnos igual, pero es posible que esta respuesta sea validada por otra entidad a través de un XSD o alguna otra cosa. Y por tanto dichos namespace nos podrian generar fallos.

Para evitar la inclusión del namespace hay una solución específica y es indicarle un namespace vacio, así:

<enrich>
    <source clone="false" type="inline">
        <total xmlns="">2</total>
    </source>
    <target action="child" type="body"/>
</enrich>
<enrich>
    <source clone="false" type="inline">
        <description xmlns="">list of books</description>
    </source>
    <target action="sibling" type="custom" xpath="//bookstore"/>
</enrich>

De la forma anterior, la nueva salida será igual pero sin namespaces asociados a los nodos incluidos:

<jsonObject>
    <bookstore>
        <name>the starts my destination</name>
        <author>Alfred Bester</author>
    </bookstore>
    <description>list of books</description>
    <bookstore>
        <name>Ender's Game</name>
        <author>Orson S. Card</author>
    </bookstore>
    <total>2</total>
</jsonObject>

No hay comentarios:

Publicar un comentario