Ako spracovať JSON/XML string v SAP Cloud Applications Studiu? – 1. časť
Napísali: Kristián Kačinetz, SAP Developer & Ondrej Rimovský, SAP Developer
Vytvorenie integrácie na aplikácie tretích strán je v dnešnej dobe veľmi častá požiadavka. Prepojenie viacerých riešení a maximalizovanie pridanej hodnoty pre klienta je úlohou mnohých dodávateľov softvérových riešení. Výnimkou nie sme ani my.
Keďže sa orientujeme na CX riešenia, veľkú množinu z nášho zamerania tvoria SAP systémy. V týchto časoch sa veľmi výrazne dostávajú do popredia cloudové riešenia. Celú paletu cloudových riešení má samozrejme aj SAP. Toto portfólio SAP cloudových riešení sa nazýva SAP C4HANA. Veríme, že názov SAP C4HANA nie je pre Vás novým pojmom, ale aj keby tomu tak bolo, samozrejme nevadí a viac sa o tejto téme môžete dozvedieť v rámci našich Anodius článkov.
Do tohto portfólia patrí aj riešenie SAP Sales/Service Cloud (zast. SAP C4C), ktoré sme integrovali s riešením tretej strany. Tretia strana nám poskytla RESTful API, pre vykonávanie potrebných operácií. Zdanlivo bezproblémový scenár, koniec koncov nebol až tak bezproblémový.
Nakoľko SAP Sales/Service Cloud nepodporuje natívne spracovanie odpovedí z REST webových služieb (pomocou SAP Cloud Application Studio), rozhodli sme sa tieto REST služby spracovať v Jave a „transformovať“ ho do podoby SOAP služby, ktorej odpovede je v riešení SAP Sales/Service Cloud možné mapovať priamo do objektov popísaných touto webovou službou. Následne spracovanie je teda pomerne dobre implementovateľné v rámci ABSL metód. Prinášame vám prvý zo série článkov zameraných na tému – webové služby a ich použitie/spracovanie v SAP Sales/Service Cloude.
Zdrojové súbory k projektu sú dostupné na stiahnutie na konci tohto článku.
Úvodom je potrebné si zvoliť vhodné IDE pre prácu s Java projektami, keďže v tomto prostredí budeme ďalej pracovať a vytvárať spomínaný SOAP webservice. My sme si na základe našich pozitívnych skúseností vybrali prostredie na vývoj IntelliJ od spoločnosti JetBrains. IntelliJ je dostupné aj vo verzii Community, ktorá je bezplatne dostupná a stiahnuť si ju môžete priamo zo stránok výrobcu.
Budeme využívať Maven projekt nakoľko umožňuje jednoduché vytvorenie webových aplikácií ako aj generovanie SOAP web služby. Na samotný beh aplikácie využijeme SAP Cloud Platform. V rámci tejto platformy je možné využiť dedikovaný Java server a nasadzovať Java aplikácie komprimované do súboru s príponou .war.
Na beh aplikácie je možné využiť aj vlastný Tomcat server, my využijeme na demonštračné účely možnosť spustenia aplikácie na SAP Cloud Platforme.
Na stiahnutie
How to process JSON/XML string in SAP Cloud Applications Studio – Part 1
Vytvorenie Maven projektu
V IntelliJ si vytvoríme nový projekt. Pri vytváraní zvolíme Maven, zaklikneme Create from archetype a vyhľadáme archetype webapp, tak ako je ilustrované nasledujúcim obrázkom:
V nasledujúcich krokoch budeme vyzvaní k výberu mena projektu, zvyšné nastavenia môžeme ponechať tak ako sú. IDE vygeneruje štruktúru projektu. V koreňovom adresári nájdeme súbor pom.xml, ktorého obsah súboru je vypísaný nižšie:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance" xsi_schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0 </modelVersion> <groupId>org.anodius.soap.guide </groupId> <artifactId>soap_guide </artifactId> <version>1.0-SNAPSHOT </version> <packaging>war </packaging> <name>First SOAP WebService </name> <url>http://www.anodius.com </url> <properties> <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding> <maven.compiler.source>1.7 </maven.compiler.source> <maven.compiler.target>1.7 </maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit </groupId> <artifactId>junit </artifactId> <version>4.13 </version> <scope>test </scope> </dependency> <dependency> <groupId>com.sun.xml.ws </groupId> <artifactId>jaxws-rt </artifactId> <version>2.2 </version> </dependency> <dependency> <groupId>com.sun.istack </groupId> <artifactId>istack-commons-runtime </artifactId> <version>3.0.8 </version> </dependency> </dependencies> <build> <finalName>soap_guide </finalName> <pluginManagement> <!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin </artifactId> <version>3.1.0 </version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin </artifactId> <version>3.0.2 </version> </plugin> <plugin> <artifactId>maven-compiler-plugin </artifactId> <version>3.8.0 </version> </plugin> <plugin> <artifactId>maven-surefire-plugin </artifactId> <version>2.22.1 </version> </plugin> <plugin> <artifactId>maven-war-plugin </artifactId> <version>3.2.2 </version> </plugin> <plugin> <artifactId>maven-install-plugin </artifactId> <version>2.5.2 </version> </plugin> <plugin> <artifactId>maven-deploy-plugin </artifactId> <version>2.8.2 </version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins </groupId> <artifactId>maven-compiler-plugin </artifactId> <configuration> <source>8 </source> <target>8 </target> </configuration> </plugin> </plugins> </build> </project>
Na záver tejto časti si ešte nastavíme SDK. Do nastavení sa dostaneme klávesovou skratkou CTRL + ALT + SHIFT + S. Prejdeme do sekcie Platformové Nastavenia kde klikneme na SDKs. V hornej časti okna klikneme na ikonu plus a vyberieme možnosť stiahnuť JDK.
Zo zoznamu si vyberieme Oracle OpenJDK, prostredie nám ponúkne aktuálnu verziu JDK a umiestnenie do ktorého bude uložené. Následne prejdeme opäť do sekcie Project Settings, klikneme na záložku projekt a v Project SDK zvolíme openjdk-{version}.
Vytvorenie SOAP služby
V main zložke si vytvoríme zložku Java. Ako podadresáre zložky Java si vytvoríme dva nové packages: types a soap. Jeden bude potrebný pre typy a druhý pre SOAP služby. Po tomto kroku by mal mať náš projekt nasledovnú štruktúru:
V package types vytvoríme novú Java triedu s názvom UserName. V tejto triede si definujeme dve nové privátne premenné typu String, konkrétne Name a Surname. Následne klikneme pravým tlačidlom niekde v priestore editora a zvolíme Generate (dá sa vyvolať aj cez klávesovú skratku ALT + Insert) a necháme vygenerovať Getter a Setter metódy:
Po úspešnom generovaní Get a Set metód, kód našej triedy UserName by mal vyzerať nasledovne:
package types; public class UserName { private String Name, Surname; public String getName() { return Name; } public void setName(String name) { Name = name; } public String getSurname() { return Surname; } public void setSurname(String surname) { Surname = surname; } }
V rámci package types si vytvoríme ešte jednu triedu, ktorá nám bude slúžiť na vrátenie kolekcie typu UserName v našej SOAP službe. Túto triedu nazveme UserNames. V tejto triede si definujeme jednu privátnu premennú UserNames, ktorá bude typu List<UserName> a následne je postup rovnaký ako v prípade prvej triedy a necháme si vygenerovať Getter a Setter metódy.
Vo výsledku by kód našej triedy UserNames mal vyzerať nasledovne:
package types; import java.util.List; public class UserNames { private ListUserNames; public List getUserNames() { return UserNames; } public void setUserNames(List userNames) { UserNames = userNames; } }
V package soap si vytvoríme novú triedu a nazveme ju napríklad GuideService. V tejto triede budú definované operácie (metódy) našej SOAP služby.
Kód tejto metódy bude nasledovný:
package soap; import types.*; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import java.util.ArrayList; import java.util.List; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public class GuideService { @WebMethod(operationName = "sayHello") public String sayHello(@WebParam(name="guestname") String guestname) { if (guestname == null) { return "Hello"; } return "Hello " + guestname; } @WebMethod(operationName = "printNames") public UserNames printNames() { UserNames usrNames = new UserNames(); ListusrName = new ArrayList<>(); UserName usr1 = new UserName(); UserName usr2 = new UserName(); usr1.setName("John"); usr1.setSurname("Doe"); usr2.setName("Andrew"); usr2.setSurname("Eod"); usrName.add(usr1); usrName.add(usr2); usrNames.setUserNames(usrName); return usrNames; } }
Aby sme frameworku jaxws poskytli inštrukciu o tom, že máme službu počúvajúcu na akýkoľvek poskytnutý koncový bod, musíme vytvoriť súbor sun-jaxws.xml. Tento súbor vytvárame v zložke src/main/webapp/WEB-INF.
Obsah tohto súboru by mal vyzerať nasledovne:
<?xml version="1.0" encoding="UTF-8"?> <endpoints version="2.0"> <endpoint name="GuideService" implementation="soap.GuideService" url-pattern="/guideService" > </endpoint> </endpoints>
V rovnakej zložke sa nachádza aj súbor web.xml, ktorého obsah upravíme nasledovne:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>guideService</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>guideService</servlet-name> <url-pattern>/guideService</url-pattern> </servlet-mapping> <session-config> <session-timeout>120</session-timeout> </session-config> </web-app>
Ak chceme aby úvodná stránka obsahovala odkaz na našu SOAP službu tak editujeme súbor index.jsp v priečinku src/main/webapp/ obsahom uvedeným nižšie:
<html> <body> <h2>SOAP Service is available <a href="./guideService">here</a>!</h2> </body> </html>
Vytvorenie .war súboru
V prípade, že využívate IntelliJ IDEA vo verzii Ultimate postačuje v builde kliknúť na Build Archetypes a vybrať všetky. V našom prípade pri využití verzie Community IntelliJ IDEA musíme najskôr stiahnuť a nastaviť Maven. Zo stránky Mavenu si stiahneme balík napríklad v .zip archíve.
Archív rozbalíme do nášho užívateľského priečinku:
C:Users{user_name} .maven
Rovnako si stiahneme Oracle OpenJDK, ktoré by pri výbere preddefinovaného priečinku malo byť umiestnené v užívateľskom priečinku:
C:Users{user_name} .jdksopenjdk-{version}
V rámci Window si definujeme dve nové systémové premenné JAVA_HOME a MAVEN. Premenné sa definujú v premenných prostredia.
V používateľských premenných editujeme premennú Path a pridáme dva nové záznamy, tak ako je ilustrované nasledujúcim obrázkom:
Následne si otvoríme príkazový riadok a otestujeme funkčnosť Mavenu zadaním príkazu „mvn -v“.
Následne sa v príkazovom riadku odnavigujeme do koreňového adresáru nášho projektu. V tomto adresári spustíme príkaz: mvn package
V príkazovom riadku by sme mali vidieť nasledujúci výstup:
V koreňovom priečinku sa vytvorí priečinok s názvom target, ktorý obsahuje náš .war súbor:
Nahranie aplikácie na SAP Cloud Platform
Posledným krokom je nahranie aplikácie na SAP Cloud Platform. Po prihlásení do SAP Cloud Platform sa prepneme do prostredia Neo. V ľavej hlavnej navigačnej lište klikneme na Applications a vyberieme Java Applications. V ľavom hornom rohu hlavnej časti webovej stránky klikneme na tlačidlo Deploy Application, následne sa nám zobrazí formulár, ktorý vyplníme tak ako to ilustruje obrázok nižšie:
Klikneme v dolnej časti formulára na tlačidlo Deploy a po nahraní aplikácie klikneme na tlačidlo Start:
Klikneme na odkaz ktorý nás presmeruje na podrobnejšie informácie o aplikácii:
V sekcii Application URLs klikneme na odkaz a budeme presmerovaný na nasledujúcu stránku:
Po kliknutí na odkaz budeme tentokrát presmerovaný na hlavnú stránku našej SOAP služby:
Môžeme si stiahnuť WSDL našej služby, WSLD obsahuje aj odkaz na XSD schému. Službu je možné otestovať nástrojmi ako sú SoapUI alebo Postman:
Na výstupe je možné vidieť že odpoveď obsahuje dve entity, ktoré sme si definovali v našom Java projekte.
Pokračovanie nabudúce…
V nasledujúcej časti série článkov si ukážeme, ako je možné našu SOAP službu rozšíriť o spracovanie odpovedí z REST webových služieb vo formáte JSON.