jueves, 3 de septiembre de 2015

WSO2 ESB: Error WSA Action igual a null

Revisando un error que le daba a un cliente luego de seguir un tutorial del año 2012 en el sitio de WSO2 me decidí a postear la solución pues pasa por ser bastante sencilla y les puede ahorrar algunos minutos de su tiempo.

El tutorial lo pueden encontrar en este enlace, y está bastante completo. Incluye los ficheros de configuración tanto del servicio de acceso a datos como de la API en el WSO2 ESB.

En el mismo se aclaran las versiones de las herramientas y esto es importante pues el ESB usando es el 4.0.3 y ya vamos por el 4.8.1, casi que el 4.9.0(este es el que usé en su RC1 para el ajuste).

El error:
Al invocar al método GET del API usando un cliente REST podemos apreciar el error:

Este es un error típico que se nos puede presentar y básicamente consiste en que a partir de la información proporcionada no se puede identificar la operación a invocar en el backend. En este caso falta el WSA Action, que es enviado como null.

Si revisamos la secuencia encargada de crear la petición y enviarla al backend tenemos lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="StudentGetInSequence">
    <payloadFactory>
        <format>
            <p:GetStudent xmlns:p="http://ws.wso2.org/dataservice">
                <p:registration_number>$1</p:registration_number>
            </p:GetStudent>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" expression="get-property('uri.var.registrationNumber')"/>
        </args>
    </payloadFactory>
    <send>
        <endpoint key="StudentServiceEndpoint"/>
    </send>
</sequence> 

Esta secuencia debe ser modificada para que incluya el mediador header añadiendo un Action, antes de pasar al mediador send, encargado de enviar la solicitud al backend, quedando entonces de la siguiente manera la secuencia.

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="StudentGetInSequence">
    <payloadFactory>
        <format>
            <p:GetStudent xmlns:p="http://ws.wso2.org/dataservice">
                <p:registration_number>$1</p:registration_number>
            </p:GetStudent>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" expression="get-property('uri.var.registrationNumber')"/>
        </args>
    </payloadFactory>
 <header name="Action" value="urn:GetStudent"/>
    <send>
        <endpoint key="StudentServiceEndpoint"/>
    </send>
</sequence>


Noten que se ha añadido el header antes del mediador send.

Si volvemos a probar el servicio obtendremos una respuesta válida:

NOTA: para cada secuencia correspondiente a una operación se debe realizar el mismo procedimiento para garantizar que se envía el Action en el request.

0 comentarios:

Publicar un comentario