No es la primera vez que en este blog hablamos de mapeos en SAP PI, concretamente hace un tiempo escribimos sobre los mapeos gráficos y el tratamiento de contextos. https://orekait.com/blog/sap-pi-mapeo-de-valores-dentro-del-graphical-mapping-editor/

En esta ocasión, explicaremos cómo se realizan los mapeos JAVA en SAP PI. El artículo se dividirá en dos puntos principales:

  1. Construcción del programa .JAR
  2. Configuración del mapeo JAVA en SAP PI

Pero antes… responderemos a la siguiente pregunta: ¿Cuándo optar por un mapeo Java?

Los mapeos JAVA permiten realizar transformaciones avanzadas a los contenidos de los mensajes intercambiados entre distintos adaptadores en SAP PI, tanto de tipo texto (xml, csv…) como ficheros binarios no estructurados que no tienen cabida en un mapeo gráfico. Dicho esto, entremos en materia.


Construcción programa .JAR

La clase que tienen que extender todos nuestros mapeos java, es la clase abstracta AbstractTransformation.  Esta clase contiene a su vez el método abstracto Transform que es el que tendremos que redefinir y sobre el que trabajaremos.

Antes de empezar a construir nuestro mapeo. Debemos importar las librerías necesarias. Hacemos clic derecho sobre el proyecto y navegamos hasta Build Path, una vez ahí desplegamos y hacemos clic en Add Libariries.



Seleccionamos la librería XPI Library y le damos a finalizar.


Una vez creada la clase, deberemos decirle que extiende el método abstracto antes mencionado e importar los paquetes necesarios.


Veremos que la línea muestra una advertencia. Esto quiere decir que al extender esta clase abstracta deberíamos sobre escribir su método abstracto “transform”.


Si hacemos click en la opción “Add unimplemented methods” se nos generará el código necesario para sobre escribir el método, con la etiqueta: @Override que significa que es un método que estamos redefiniendo.


Este método tiene dos parámetros en su definición:

  1. Parametro In: Es del tipo TrasformatiónInput y es el objeto de entrada del mapeo.
  2. Parametro Out: Es del tipo TransformOutput y es el objeto de salida del mapeo.

Dentro de este método es, como ya hemos dicho, donde se crea la lógica del mapeo.

Lo primero que debemos hacer es recopilar los Stream tanto de entrada como de salida.


También podremos recopilar los parámetros que se hayan definido en PI (más adelante veremos como hacer esto) para el input. Esto se hará de la siguiente manera:



Para leer el Stream del inputStream que hemos recopilado, utilizaremos la clase ImputStreamReader a la que pasaremos como parámetros el ImputStream y el encoding. El encoding será un parámetro del tipo Charset.


Leeremos el stream hasta que el reader devuelva un -1 que significa que a llegado al final del Stream. Cada char leído se añadirá a un String.

El encoding es un parámetro importante a tener en cuenta. Si utilizamos en este punto un encoding de lectura diferente al encoding original del documento, podemos estar creando un String con errores que pueden afectar a nuestro mapeo. Una posible solución podría ser indicar por parámetro el encoding original del documento y leer en el mismo.

Una vez realizada la lectura de la entrada podemos hacer las correspondientes trasformaciones. Por ejemplo, pasara de JSON a XML. Tal como hacemos aquí:


Cuando tengamos nuestro String de salida convertido. Utilizaremos el método getBytes de la clase String indicando el encoding que queremos utilizar y le pasaremos el resultado al método Write del outputStream:


No está de menos recordar que en todo momento tendremos que capturar las posibles excepciones que generen tanto la lectura del inputstream como la escritura en el outputstream, con la debida estructura Try-cach, aunque el propio IDE nos advertirá de ello.


Una vez tengamos el código java, tendremos que exportar el fichero .JAR necesario para después utilizarlo en PI.

Haciendo click derecho en el proyecto:



Configuración PI

Una vez tengamos nuestro Soware component Version creado y nuestro namespace definido, en la sección de imported Archives indicaremos nuestro archivo .JAR. También tendremos que importar en elementos aparte los .JAR de las librerías externas que hallamos utilizado:


El siguiente punto será en nuestro Operation Mapping. Aquí, tendremos que indicar que vamos a hacer un mapeo Java y seleccionar el archivo.


Para indicar los parámetros que queremos enviar a nuestro mapeo, primero definiremos los parámetros desde el menú que despliega el botón parameters. Después, desde el binding del Mapping Program estableceremos la relación entre el parámetro definido y el nombre del parámetro en nuestro mapeo, en este caso serán el mismo.



El último punto a tener en cuenta será: donde le indicaremos los valores de estos parámetros. Esto se hará desde el Integration Builder. En el Interface Determination le indicaremos el Operation Mapping que utilizaremos y es en este momento cuando podremos establecer un valor en los parámetros de entrada.


Con todo esto ya tendremos el escenario de integración preparado para realizar un tratamiento avanzado del payload de un mensaje intercambiado entre distintos sistemas a través de SAP PI. Si quieres saber más… ¡No dudes en contactar con nosotros!