Wrap the payload into SOAP Envelope using java mapping in SAP PO
Requirement: We need to send the SOAP Envelope payload using REST Adapter.
Solution: As the REST Adapter doesn\’t have the option to wrap the payload in SOAP Envelope similar to SOAP Adapter. So, this is done using java mapping to wrap the message in SOAP Envelope.
Here the requirement is to send the one record per message to API, so we have used the multi mapping and the payload contains <messages> tags as well, so we just can\’t simply add the SOAP Envelope tags to the start and end of the tags. We need to keep the <messages> tags as the outer-most tags in the final payload. So we have written the below code to do the same. It can be modified as per the requirement.
Input Payload
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<ns0:Messages xmlns:ns0=\"http://sap.com/xi/XI/SplitAndMerge\">
<ns0:Message1>
<ns2:AddUser xmlns:ns2=\"http://tempuri.org/\">
<ns2:ServerName>a</ns2:ServerName>
<ns2:DatabaseName>a</ns2:DatabaseName>
<ns2:UniqueNumber/>
<ns2:Type/>
<ns2:FirstName/>
<ns2:LastName/>
<ns2:JobTitle/>
<ns2:EmailAddress/>
<ns2:MobileNumber/>
<ns2:ManagerUniqueNumber/>
<ns2:Department/>
<ns2:Company/>
<ns2:KeyValueList/>
</ns2:AddUser>
</ns0:Message1>
</ns0:Messages>
Final Payload
<ns0:Messages xmlns:ns0=\"http://sap.com/xi/XI/SplitAndMerge\">
<ns0:Message1>
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body><ns2:AddUser xmlns:ns2=\"http://tempuri.org/\">
<ns2:ServerName>a</ns2:ServerName>
<ns2:DatabaseName>a</ns2:DatabaseName>
<ns2:UniqueNumber/>
<ns2:Type/>
<ns2:FirstName/>
<ns2:LastName/>
<ns2:JobTitle/>
<ns2:EmailAddress/>
<ns2:MobileNumber/>
<ns2:ManagerUniqueNumber/>
<ns2:Department/>
<ns2:Company/>
<ns2:KeyValueList/>
</ns2:AddUser>
</soapenv:Body>
</soapenv:Envelope>
</ns0:Message1>
</ns0:Messages>
Java Mapping
package com.test.java;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import com.sap.aii.mapping.api.AbstractTransformation;
import com.sap.aii.mapping.api.StreamTransformationException;
import com.sap.aii.mapping.api.TransformationInput;
import com.sap.aii.mapping.api.TransformationOutput;
/* This class is created to wrap the payload with SOAP Envelope Tags
*/
public class test extends AbstractTransformation {
public void transform(TransformationInput in, TransformationOutput out)throws StreamTransformationException
{
String prefix= \"<soapenv:Envelope xmlns:soapenv=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\">\\r\\n\" +
\" <soapenv:Header>\\r\\n\" +
\" </soapenv:Header>\\r\\n\" +
\"\\r\\n\" +
\" <soapenv:Body>\";
String inputPayload= convertStreamToString(in.getInputPayload().getInputStream());
inputPayload = inputPayload.replaceAll(\"<\\\\?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"\\\\?>\" , \"\" );
inputPayload = inputPayload.replaceAll(\"<ns2:AddUser xmlns:ns2=\\\"http://tempuri.org/\\\">\", prefix+\"<ns2:AddUser xmlns:ns2=\\\"http://tempuri.org/\\\">\");
inputPayload = inputPayload.replaceAll(\"</ns2:AddUser>\", \"</ns2:AddUser>\"+\" </soapenv:Body>\\r\\n\" +
\"</soapenv:Envelope>\\r\\n\" +
\"\");
OutputStream outputstream = out.getOutputPayload().getOutputStream();
try {
outputstream.write((inputPayload).getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
//This method is used to convert the input steam payload to String, it can be used anywhere without modification
public String convertStreamToString(InputStream in){
StringBuffer sb = new StringBuffer();
try
{
InputStreamReader isr = new InputStreamReader(in);
Reader reader =
new BufferedReader(isr);
int ch;
while((ch = in.read()) > -1) {
sb.append((char)ch);}
reader.close();
}
catch(Exception exception) { }
return sb.toString();
}
}
1 comment