cancel
Showing results for 
Search instead for 
Did you mean: 

SOAP Receiver adapter Issue

0 Kudos

Hello Experts,

we are using SOAP receiver adapter in SOAP Look Up to fetch values from Workday Application.

While giving a SOAP call from Message Mapping to workday system, getting an below error.

"Error while calling the SystemAccessorHMI's process Exception during processing the payload. Error when calling an adapter by using the communication channel CC_SOAP_Test (Party: , Service: TESTReceiver, Object ID: 253bfe41be373b1286895c50c36a5998) XI AF API call failed. Module exception: 'SOAP adapter processing error'. Cause Exception: 'SOAP: Response message contains an errorXIAdapter/PARSING/ADAPTER.SOAP_EXCEPTION - soap fault: invalid username or password'.

com.sap.aii.mapping.lookup.LookupException: Error when calling an adapter by using the communication channel CC_SOAP_Test (Party: , Service: TESTReceiver, Object ID: 253bfe41be373b1286895c50c36a5998) XI AF API call failed. Module exception: 'SOAP adapter processing error'. Cause Exception: 'SOAP: Response message contains an errorXIAdapter/PARSING/ADAPTER.SOAP_EXCEPTION - soap fault: invalid username or password'."

This is working fine while I tested in SOAP UI if we we supply the parameter WSS-Password Type = PasswordText then it works fine and gives us the SOAP response.

Now In PI during end to end test we are getting above error.

Already checked this link : Receiver SOAP Adapter Issue | SCN - as shown in the link do I need redevelop all my code ?

Now the query is how can I supply the above parameter WSS-Password Type = PasswordText  in SOAP url or any other way to supply this parameter.

Thanks in advance.

Kumar

Accepted Solutions (1)

Accepted Solutions (1)

iaki_vila
Active Contributor
0 Kudos

Hi Kummar,

The WSS-Password tag should to be in the SOAP header, have you tried to pass it in the SOAP header?.

Regards.

0 Kudos

yes I have passed, even then same error.

I have one doubt in WSDL. The WSDL provided by workday team seems REST ful service.

Please check the urls. I have took one sample url from PI. ports are different. have a look and let me know.

sample PI WSDL port :

<wsdl:service name="SI_EmployeeRAAS_Req_OutService">

<wsdl:port name="HTTP_Port" binding="p1:SI_EmployeeRAAS_Req_OutBinding">

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="http://glosxd1cid01v.hgrs.holcim.net:50000/XISOAPAdapter/MessageServlet?senderParty=&senderService=T..."/>

</wsdl:port>

<wsdl:port name="HTTPS_Port" binding="p1:SI_EmployeeRAAS_Req_OutBinding">

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="https://glosxd1cid01v.hgrs.holcim.net:50001/XISOAPAdapter/MessageServlet?senderParty=&senderService=...

Workday WSDL port & binding

<wsdl:portType name="ReportPortREST">

<wsdl:operation name="Execute_Report">

<wsdl:input name="Execute_ReportInput" message="wd:RequestMsg"/>

<wsdl:output name="Execute_ReportOutput" message="wd:ResponseMsg"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:portType name="ReportPort">

<wsdl:documentation/>

<wsdl:operation name="Execute_Report">

<wsdl:input name="Execute_ReportInput" message="wd:Execute_ReportInputMsg"/>

<wsdl:output name="Execute_ReportOutput" message="wd:Report_DataOutputMsg"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="ReportBinding" type="wd:ReportPort">

<soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="Execute_Report">

<soapbind:operation style="document"/>

<wsdl:input name="Execute_ReportInput">

<soapbind:body use="literal"/>

</wsdl:input>

<wsdl:output name="Execute_ReportOutput">

<soapbind:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:binding name="ReportRESTBinding" type="wd:ReportPortREST">

<httpbind:binding verb="GET"/>

<wsdl:operation name="Execute_Report">

<httpbind:operation location="Execute_Report"/>

<wsdl:input>

<httpbind:urlEncoded/>

</wsdl:input>

<wsdl:output>

<mimebind:content type="text/xml" part="body"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="ReportService">

<wsdl:port name="Report" binding="wd:ReportBinding">

</wsdl:port>

<wsdl:port name="ReportREST" binding="wd:ReportRESTBinding">

</wsdl:port>


My doubt is they exposed as us REST service and asking to consume Webservice is a problem

kindly check and throw some inputs.

Regards,

Kumar

0 Kudos

Hello Inaki,

I have passed as you said, in Header.

I had constructed whole SOAP envelope as one string and passing this string to UDF, I am succeed to pass the values, but output is empty and at channel level checked "Do not use envelope" Option.

I have observed one more issue, PI is hosted in VPN and workday system(calling as webservice) is not in VPN.

Will this be an issue..?

Please give your inputs.

Thanks,

Kumar

iaki_vila
Active Contributor
0 Kudos

Hi Kumar,

It could be a problem if PI is in VPN, i recommend to you to use this tool

If you have not access to the directory with the file you can work together with your basis team.

Regards.

0 Kudos

Hello Inaki,

I had used the above trace tool and this is more helpful to me.

Now I am able to get the response from Workday system to PI Communication channel. There may be issue in parsing the payload. I am looking into this.

Thanks,

Kumar

0 Kudos

Hello Inaki,

Thanks for your help.

Issue got solved. Problem lies after parsing input, I am not able to traverse through nodes because of this line in code : org.w3c.dom.Node nodeCust= list.item(i);

Now I had replaced this with normal node traversing Node nNode = nList.item(temp);

Finally issue got solved. Thanks for all your valuable inputs.

Regards,

Kumar

Answers (2)

Answers (2)

manoj_khavatkopp
Active Contributor
0 Kudos

Kumar,

To add authentication at soap header level you can either :

Use AddSoapHeaderBean:

Use XSLT/JAVA to build SOAP envelope in mapping.

Br,

Manoj

0 Kudos

Hello Manoj,

Thanks for your Reply.

I am using SOAP receiver channel in UDF as a SOAP Look up to get response from workday system. Java/XSLT code will help me ?

Please let me know if this is possible to send this param in Module bean makes my job easy.

Regards,

Kumar

former_member182412
Active Contributor
0 Kudos

Hi Kumar,

AddSOAPHeaderBean is the module only, try configure this module in your receiver SOAP adapter.

Regards,

Praveen.

Former Member
0 Kudos

Hi Kumar,

You can add the SOAP Header with WSSE tag as you have tested in SOAP UI using XSLT and then add the XSLT mapping in your receiver channel using MessageTransformBean module.

Regards,

AJ

0 Kudos

Praveen - Thanks for your reply.

I have one doubt in WSDL. The WSDL provided by workday team seems REST ful service.

Please check the urls. I have took one sample url from PI. ports are different. have a look and let me know.

sample PI WSDL port :

<wsdl:service name="SI_EmployeeRAAS_Req_OutService">

<wsdl:port name="HTTP_Port" binding="p1:SI_EmployeeRAAS_Req_OutBinding">

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="http://glosxd1cid01v.hgrs.holcim.net:50000/XISOAPAdapter/MessageServlet?senderParty=&senderService=T..."/>

</wsdl:port>

<wsdl:port name="HTTPS_Port" binding="p1:SI_EmployeeRAAS_Req_OutBinding">

<soap:address xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" location="https://glosxd1cid01v.hgrs.holcim.net:50001/XISOAPAdapter/MessageServlet?senderParty=&senderService=...

Workday WSDL port & binding

<wsdl:portType name="ReportPortREST">

<wsdl:operation name="Execute_Report">

<wsdl:input name="Execute_ReportInput" message="wd:RequestMsg"/>

<wsdl:output name="Execute_ReportOutput" message="wd:ResponseMsg"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:portType name="ReportPort">

<wsdl:documentation/>

<wsdl:operation name="Execute_Report">

<wsdl:input name="Execute_ReportInput" message="wd:Execute_ReportInputMsg"/>

<wsdl:output name="Execute_ReportOutput" message="wd:Report_DataOutputMsg"/>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="ReportBinding" type="wd:ReportPort">

<soapbind:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="Execute_Report">

<soapbind:operation style="document"/>

<wsdl:input name="Execute_ReportInput">

<soapbind:body use="literal"/>

</wsdl:input>

<wsdl:output name="Execute_ReportOutput">

<soapbind:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:binding name="ReportRESTBinding" type="wd:ReportPortREST">

<httpbind:binding verb="GET"/>

<wsdl:operation name="Execute_Report">

<httpbind:operation location="Execute_Report"/>

<wsdl:input>

<httpbind:urlEncoded/>

</wsdl:input>

<wsdl:output>

<mimebind:content type="text/xml" part="body"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="ReportService">

<wsdl:port name="Report" binding="wd:ReportBinding">

<soapbind:address location="https://wd3-impl-services1.workday.com/ccx/service/Report2/lafarge5/sgupta-impl/Employee_Interface_E..."/>

</wsdl:port>

<wsdl:port name="ReportREST" binding="wd:ReportRESTBinding">

<httpbind:address location="https://wd3-impl-services1.workday.com/ccx/service/customreport2/lafarge5/sgupta-impl/Employee_Inter..."/>

</wsdl:port>


My doubt is they exposed as us REST service and asking to consume Webservice is a problem

kindly check and throw some inputs.

Regards,

Kumar

former_member186851
Active Contributor
0 Kudos

Hello Kumar,

Are you using SOAP UDF?

In the code/parameters ensure ur username/password is correct.

0 Kudos

Raghuraman - Yes, we are using UDF in Mapping.

Regards,

Kumar

former_member186851
Active Contributor
0 Kudos

Hello Kumar,

Post the code and let us know how ur passing login credentials.

0 Kudos

Hi Raghu,

I am passing Login Credentails from SOAP channel not in mapping as parameters.

Code :

public String RAASCALL(String PayGroupID, String CompletedDate, String v3, Container container) throws StreamTransformationException{

AbstractTrace trace = container.getTrace();

  //String v1=null;

  //String v2=null;

// String v3=null;

StringBuffer sbf=null;

  try { 

  /*Pass the Business System and Communication Channel as  input to the getChannel().

  BS_SOAPLOOKUP – Business System*CC_Webservice_SOAP_CURRENCY_CONVERTOR – Receiver SOAP Adapter */ 

  Channel channel = LookupService.getChannel("TESTReceiver","CC_SOAP_Test"); 

  SystemAccessor accessor = LookupService.getSystemAccessor(channel); 

  /* Construct the SOAP Request Message using the InputParameters

  FromCurrency , ToCurrency are the Input Parameters.*/

String SOAPxml=

//"<?xml version=\"1.0\" encoding=\"UTF-8\"\"?>"

     "<Execute_Report><Report_Parameters>"+

            "<Pay_Group Descriptor=\"\">"+

            "<ID type=\"WID\">"+PayGroupID+"</ID>"+

             "</Pay_Group><Completed_Date_On_or_After>"+CompletedDate+"</Completed_Date_On_or_After>"+

              "<Completed_Date_On_or_Before>"+v3+"</Completed_Date_On_or_Before>"+

               " </Report_Parameters></Execute_Report>";

 

  InputStream inputStream =new ByteArrayInputStream(SOAPxml.getBytes());

  XmlPayload payload = LookupService.getXmlPayload(inputStream);

        Payload SOAPOutPayload = null;

      //The response will be a Payload. Parse this to get the response field out.

  SOAPOutPayload = accessor.call(payload);

 

     sbf=new StringBuffer();

 

  /* Parse the SOAPPayload to get the SOAP Response back. 

  */

 

   InputStream inp = SOAPOutPayload.getContent(); 

         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

         /* Create DOM structure from input XML */

         DocumentBuilder builder = factory.newDocumentBuilder();  

                         Document document = builder.parse(inp); 

/*Node Traverse*/

                        

NodeList list = document.getElementsByTagName("Report_Data");

for (int i =0;i<list.getLength();i++) //getting all my report entries

{

        org.w3c.dom.Node nodeCust= list.item(i);

        if(nodeCust.getLocalName().equalsIgnoreCase("Report_Entry"))

        {

                        NodeList itr11 = nodeCust.getChildNodes();

                       

           for (int j = 0; j < itr11.getLength(); j ++)

  {

             Element c = (Element)itr11.item(j);

             if(c.getLocalName().equalsIgnoreCase("Action_Event"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("Overal_Business_Process"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("Transaction_Effective_Moment"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("Transaction_Entry_Moment"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("Business_process_Reason"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("Business_Process_Type"))

             {

                       sbf.append(c.getTextContent()+",");

             }

             if(c.getLocalName().equalsIgnoreCase("About_Worker"))

             {

                       sbf.append(c.getTextContent());

             }

           }

        sbf.append("#");

                       

        }

     }

}catch (Exception e){ 

    trace.addWarning("Error" + e); 

return sbf.toString();

}