domingo, 3 de noviembre de 2019

WSO2: Enrich Mediator dinámicos

Hoy vamos a ver algo sencillito. Ya hemos hablado otras veces de WSO2 y su enrich mediator. Es un elemento muy bueno y útil. Pero igual no todo lo intuitivo que se quisiera. 

El post de hoy viene marcado por una casuística concreta. Tenemos un payload concreto al que queremos añadir un nuevo campo. Ejemplo: un objeto JSON al cual añadir un nuevo atributo. 

Ante esto tenemos dos problemas: 
  • El enrich mediator, aunque permite añadir un nuevo elemento a la altura jerarquica que queramos. No podemos crear el elemento inline de forma dinámica a través de variables de contexto. Es decir,  esto que viene a continuación, NO es válido. 
<enrich>
   <source type="inline" clone="false">
       <id xmlns="">$ctx:bookId</id>
    </source>
    <target action="sibling" xpath="//nombre"/>
</enrich>
  • El payload factory mediator, nos permite crear el payload inline y de forma dinámica. Pero nos haría volver a crear todo el payload. Lo cual dependiendo del tamaño del objeto JSON/XML puede ser algo más o menos viable. 
Por tanto, ¿Cual es la solución?. Pues lamentablemente, no hay una solución en un único paso. Lo mejor es no usar el payload factory mediator, a menos que el tamaño del objeto sea muy pequeño. Que es posiblemente con el enrich mediator. Crear el elemento online con un valor aleatorio a través del un primer enrich mediator y posteriormente modificar el valor de ese elemento a través del reemplazo en un segundo enrich mediator

<enrich>
   <source type="inline" clone="false">
      <id xmlns="">1</id>
   </source>
   <target action="sibling" xpath="//nombre"/>
</enrich>
<enrich>
   <source type="property" clone="false" property="bookId"/>
    <target xpath="//id"/>
</enrich>

Donde tendriamos un objeto JSON de vuelta, similar a este:

{
   "nombre": "the starts my destination",
   "id": 2,
   "autor": "Alfred Bester"
}

No hay comentarios:

Publicar un comentario