Jak zpracovat JSON / XML string v SAP Cloud Applications Studiu? – 1. část


Napsal Kristián Kačinetz, SAP Developer & Ondrej Rimovský, SAP Developer

Vytvoření integrace na aplikace třetích stran je v dnešní době velmi častý požadavek. Propojení více řešení a maximalizaci přidané hodnoty pro klienta, je úkolem mnoha dodavatelů softwarových řešení. Výjimkou nejsme ani my. Jelikož se orientujeme na CX řešení, velkou množinu z našeho zaměření tvoří SAP systémy. V těchto dobách se velmi výrazně dostávají do popředí cloudové řešení. Celou paletu cloudových řešení má samozřejmě i SAP. Toto portfolio SAP cloudových řešení se nazývá SAP C4HANA. Věříme, že název SAP C4HANA není pro Vás novým pojmem, ale i kdyby tomu tak bylo, samozřejmě nevadí a více se o tomto tématu můžete dozvědět v rámci našich Anodius blogů.


Do tohoto portfolia patří i řešení SAP Sales / Service Cloud (zast. SAP C4C), které jsme integrovali s řešením třetí strany. Třetí strana nám poskytla Restful API, pro provádění potřebných operací. Zdánlivě bezproblémový scénář, koneckonců nebyl až tak bezproblémový. Jelikož SAP Sales / Service Cloud nepodporuje nativní zpracování odpovědí z REST webových služeb (pomocí SAP Cloud Application Studia), rozhodli jsme se tyto REST služby zpracovat v Javě a „transformovat“ je do podoby SOAP služby, jejichž odpovědi je v řešení SAP Sales / Service Cloud možné mapovat přímo do objektů popsaných touto webovou službou. Následné zpracování je tedy poměrně dobře implementovatelné v rámci ABSL metod. Přinášíme vám první ze série blogů zaměřených na téma – webové služby a jejich použití / zpracování v SAP Sales / Service Cloudu.


Zdrojové soubory k projektu jsou dostupné ke stažení na konci tohoto blogu.


Na úvod je třeba si zvolit vhodné IDE pro práci s Java projekty, jelikož v tomto prostředí budeme dále pracovat a vytvářet zmíněný SOAP WebService. My jsme si na základě našich pozitivních zkušeností vybrali prostředí na vývoj IntelliJ od společnosti JetBrains. IntelliJ je dostupné také ve verzi Community, která je bezplatně dostupná a stáhnout si ji můžete přímo ze stránek výrobce.

Budeme využívat Maven projekt nakolik umožňuje snadné vytvoření webových aplikací, jakož i generování SOAP web služby. Na samotný běh aplikace využijeme SAP Cloud Platform. V rámci této platformy je možné využít dedikovaný Java server a nasazovat Java aplikace komprimované do souboru s příponou .war.

Na běh aplikace lze využít i vlastní Tomcat server, my využijeme pro demonstrační účely možnost spuštění aplikace na SAP Cloud Platform.

 

 

 

Na stáhnutí

How to process JSON/XML string in SAP Cloud Applications Studio – Part 1

Vytvoření Maven projektu

V IntelliJ si vytvoříme nový projekt. Při vytváření zvolíme Maven, klikneme na Create from Archetype a vyhledáme Archetype webapp, tak jak je ilustrované následujícím obrázkem:

SAP Cloud Applications Studio

V následujících krocích budeme vyzváni k výběru jména projektu, zbývající nastavení můžeme ponechat tak jak jsou. IDE vygeneruje strukturu projektu. V kořenovém adresáři najdeme soubor pom.xml, jehož obsah souboru je vypsán níže:

 

 <?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ávěr této části si ještě nastavíme SDK. Do nastavení se dostaneme klávesovou zkratkou CTRL + ALT + SHIFT + S. Přejdeme do sekce platformové nastavení, kde klikneme na SDKs. V horní části okna klikneme na ikonu plus a vybereme možnost stáhnout JDK. Ze seznamu si vybereme Oracle OpenJDK, prostředí nám nabídne aktuální verzi JDK a umístění do kterého bude uloženo. Následně přejdeme opět do sekce projektové nastavení, klikneme na záložku projekt a v Project SDK zvolíme openjdk- {version}.

Vytvoření SOAP služby

V main složce si vytvoříme složku Java. Jako podadresáře složky Java si vytvoříme dva nové packages: types a soap. Jeden bude potřebný pro typy a druhý pro SOAP služby. Po tomto kroku by měl mít náš projekt následující strukturu:

SAP Cloud Applications Studio

V package types vytvoříme novou Java třídu s názvem UserName. V této třídě si definujeme dvě nové privátní proměnné typu String, konkrétně Name a Surname. Následně klikneme pravým tlačítkem někde v prostoru editoru a zvolíme Generate (lze vyvolat i přes klávesovou zkratku ALT + Insert) a necháme vygenerovat Getter a Setter metody.


SAP Cloud Applications Studio

Po úspěšném generování Get a Set metod, kód naší třídy UserName by měl vypadat následovně:

 

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 vytvoříme ještě jednu třídu, která nám bude sloužit k vrácení kolekce typu UserName v naší SOAP službě. Tuto třídu nazveme usernames. V této třídě si definujeme jednu privátní proměnnou usernames, která bude typu List <UserName> a následně je postup stejný jako v případě první třídy a necháme si vygenerovat Getter a Setter metody.

 

 

Ve výsledku by kód naší třídy UserNames měl vypadat následovně:

 

 

package types;

import java.util.List;

public class UserNames {
    private List UserNames;

    public List getUserNames() {
        return UserNames;
    }

    public void setUserNames(List userNames) {
        UserNames = userNames;
    }
}

 

V package soap si vytvoříme novou třídu a nazveme ji například GuideService. V této třídě budou definovány operace (metody) naší SOAP služby.

 

 

Kód této metody bude následující:

 

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();
        List usrName = 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;
    }
}

 

Abychom frameworku jaxws poskytli instrukci o tom, že máme službu naslouchající na jakýkoli poskytnutý koncový bod, musíme vytvořit soubor sun-jaxws.xml. Tento soubor vytváříme ve složce src / main / webapp / WEB-INF.

 

 

Obsah tohoto souboru by měl vypadat následovně:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<endpoints 
           version="2.0">
    <endpoint name="GuideService"
              implementation="soap.GuideService"
              url-pattern="/guideService" >
    </endpoint>
</endpoints>

 

 

Ve stejné složce se nachází také soubor web.xml, jehož obsah upravíme následovně:

 

 

<!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>

 

 

Pokud chceme, aby úvodní stránka obsahovala odkaz na naši SOAP službu, tak editujeme soubor index.jsp ve složce src / main / webapp / obsahem uvedeným níže:

 

 

<html>
	<body>
		<h2>SOAP Service is available <a href="./guideService">here</a>!</h2>
	</body>
</html>

 


Vytvoření .war souboru

V případě, že využíváte IntelliJ IDEA ve verzi Ultimate postačuje v buildu kliknout na Build Archetypes a vybrat všechny. V našem případě při využití verze Community IntelliJ IDEA musíme nejdříve stáhnout a nastavit Maven. Ze stránky Mavenu si stáhneme balíček například v .zip archivu.

Archiv rozbalíme do naší uživatelské složky:

  C:Users{user_name} .maven

 

 

Stejně tak si stáhneme Oracle OpenJDK, které by při výběru předdefinované složky mělo být umístěno v uživatelské složce:

  C:Users{user_name} .jdksopenjdk-{version}

 

 

V rámci Window si definujeme dvě nové systémové proměnné JAVA_HOME a MAVEN. Proměnné se definují v proměnných prostředích.

V uživatelských proměnných editujeme proměnnou Path a přidáme dva nové záznamy, tak jak je ilustrované následujícím obrázkem:

SAP Cloud Applications Studio

Následně si otevřeme příkazový řádek a otestujeme funkčnost Mave zadáním příkazu „mvn -v„.

 

Následně se v příkazovém řádku přesunete do kořenového adresáře našeho projektu. V tomto adresáři spustíme příkaz:

mvn package

 

 

V příkazovém řádku bychom měli vidět následující výstup:


SAP Cloud Applications Studio

V kořenové složce se vytvoří složka s názvem target, který obsahuje náš .war soubor.


SAP Cloud Applications Studio

Nahrání aplikace na SAP Cloud Platform


Posledním krokem je nahrání aplikace na SAP Cloud Platform. Po přihlášení do SAP Cloud Platform se přepneme do prostředí Neo. V levé hlavní navigační liště klikneme na Applications a vybereme Java Applications. V levém horním rohu hlavní části webové stránky klikneme na tlačítko Deploy Application, následně se nám zobrazí formulář, který vyplníme tak jak to ilustruje obrázek níže
:


SAP Cloud Applications Studio

 

Klikneme v dolní části formuláře na tlačítko Deploy a po nahrání aplikace klikneme na tlačítko Start:


SAP Cloud Applications Studio

Klikneme na odkaz, který nás přesměruje na podrobnější informace o aplikaci:


SAP Cloud Applications Studio

V sekci Application URLs klikneme na odkaz a budeme přesměrováni na následující stránku:


SAP Cloud Applications Studio

 

Po kliknutí na odkaz budeme tentokrát přesměrováni na hlavní stránku naší SOAP služby:


SAP Cloud Applications Studio

Můžeme si stáhnout WSDL naší služby, WSLD obsahuje odkaz na XSD schéma. Službu je možné otestovat nástroji jako jsou SoapUI nebo Postman.


SAP Cloud Applications Studio

 

Na výstupu je možné vidět, že odpověď obsahuje dvě entity, které jsme si definovali v našem Java projektu.

 

Pokračování příště…

V následující části blogu si ukážeme, jak je možné naši SOAP službu rozšířit o zpracování odpovědí z REST webových služeb ve formátu JSON.