Hace unos días encontré con otros colegas un
problema en el desarrollo de un servicio web con BPEL en JDeveloper 11.1.1.5 que
quizás no es tan común, pero que siempre es bueno saber la solución, ya que al
principio parecería muy raro el comportamiento del Motor de SOA en el Weblogic
(10.3.5), más sin embargo, el verdadero problema radica en cómo estemos
describiendo nuestros servicios, en este caso el problema se encontraba en el
XSD.
Descripción:
Se realiza una invocación de
un Servicio Web externo, mediante el elemento "invoke" del BPEL. El
servicio web invocado es síncrono, por lo que recibe una entrada de datos y
retorna datos de salida. Por lo tanto, en un elemento "invoke" se
debe asociarle dos variables de BPEL, llamemosla "vinput" para la
variable de entrada de datos y "voutput" para la variable de salida
de datos.
Los datos retornados por el
servicio mediante "voutput" se pasan a la variable de salida del
servicio BPEL.
A continuación el diagrama
del BPEL en JDeveloper, como verán es sencillo:
Síntomas:
Al debuggear la instancia de
ese servicio SOA en el Enterprise Manager, se ve que la invocación del servicio
externo es exitosa, se le envía datos de entrada y retorna los datos correctos
de salida. Es decir la variable "vinput" es poblada por nosotros y la
variable "voutput" es poblada por el "invoke", todo esto es
exitoso.
Al querer utilizar los datos
de "voutput" y pasarlos a la salida final del servicio SOA, el motor
de SOA encuentra a la variable "vouput" VACIA y por lo tanto el
nuestro servicio SOA no retorna datos.
A continuación una imagen
donde se puede ver que se "voutput" es poblada con los datos de
salida, pero en el "transform" NO hay datos.
El elemento
"transform" es utilizado correctamente, se toman los campos de
"vouput" y se mapean a los cambos de la salida del servicio SOA, se
utiliza un elemento "for-each" pues el servicio retorna un array de
datos.
A continuación la imagen del
XSL.
Solución:
En el XSD del servicio Externo se utilizan las siguientes
clausulas dentro del tag <XSD:SCHEMA>:
attributeFormDefault="qualified"
elementFormDefault="qualified"
Al remover estas clausulas y volver a desplegar el
servicio, la ejecución fue exitosa.
Antes:
<xsd:schema
attributeFormDefault="qualified"
elementFormDefault="qualified" targetNamespace="https://.......
Despues:
<xsd:schema targetNamespace="https://......
No hay comentarios:
Publicar un comentario