I have the following Issue:
I'm making an application that sends an already digitally signed XML certificate to an official govt. Webservice.
When I generate the SOAP message, I copy the whole file to a string (I've used several techniques to do this: Guava's File.toString, Files.readAllBytes(Paths.get(path), and tried it with all relevant encodings (UTF-8 and ISO-8859-1, since the document is in spanish). I use logger to store the content of the soap message just before sending it.
The issue is that the webservice gives me an "Invalid signature" answer, but when I copy the soap message from the log, and send it via SoapUI, the webservice accepts the signed certificate.
Here's the code that does the magic:
public class SOAPClientSAAJ {
public static void SendMessage(String file, String rscpath) throws Exception {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
GetCurrentTimeStamp cts = new GetCurrentTimeStamp();
Logger logger = Logger.getLogger("MyLog");
FileHandler fh;
String logfile = rscpath+cts.GetCurrentTimeStamp()+".log";
try {
// This block configure the logger with handler and formatter
fh = new FileHandler(logfile);
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// Send SOAP Message to SOAP Server
String url = "http://172.25.1.220:8080/SGPRTWebServices/RecepcionCrt";
SOAPMessage soapResponse = null;
SOAPMessage soapmsg = null;
logger.info(file.substring(file.lastIndexOf(File.separator)));
soapmsg = createSOAPRequest(file);
ByteArrayOutputStream out = new ByteArrayOutputStream();
soapmsg.writeTo(out);
String msg = new String(out.toByteArray());
logger.info(msg);
out = null;
msg = null;
try{
soapResponse = soapConnection.call(soapmsg, url);
SOAPPart sp = soapResponse.getSOAPPart();
SOAPEnvelope se = sp.getEnvelope();
SOAPBody sb = se.getBody();
ByteArrayOutputStream out2 = new ByteArrayOutputStream();
soapResponse.writeTo(out2);
msg = new String(out2.toByteArray());
logger.info(msg);
}catch (Exception ex) {
logger.info(ex.toString());
}
soapConnection.close();
}
private static SOAPMessage createSOAPRequest(String confFilePath) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "http://recepcionCrt.ws.sgprt.mtt.cl/";
Path pat =Paths.get(confFilePath);
Charset charset = StandardCharsets.ISO_8859_1;
String texto = "<![CDATA[";
File fl = pat.toFile();
String content = Files.toString(fl, charset);
texto = texto + content +"]]>";
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.setEncodingStyle("UTF-8");
SOAPBody soapBody = envelope.getBody();
soapBody.addNamespaceDeclaration("ns2", serverURI);
SOAPElement soapBodyElem = soapBody.addChildElement ("recepcionCRT","ns2");
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement ("arg0");
soapBodyElem1.addTextNode(texto);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "recepcionCRT");
soapMessage.saveChanges();
return soapMessage;
}
}
Here:can you check some files like the wsdl, a valid certificate and a valid soap message.
As it turned out, the problem was in the communication process. I had to use the importws tool from the jdk to load the interfaces and clases to comunicate with the provider. Once I did that, the message was recieved correctly and the signature verified.
Related
One of my requirement is to send SOAP request, and receive response from Oracle UCM Cloud. I am using Java transformation to do the same. In one of the response, we receive a zip file as attachment, I am not able to capture and download the attachment.
Is there anyway to download the attachment and save to server. The code below captures the whole response into a file, but i want to capture the attachment only.
In Java, I send the below payload
payload = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:typ=\"http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/types/\">"+
"<soapenv:Header/>\n"+
"<soapenv:Body>\n"+
"<typ:downloadESSJobExecutionDetails>\n"+
"<typ:requestId>"+i_jobid+"</typ:requestId>\n"+
"<typ:fileType>log</typ:fileType>\n"+
"</typ:downloadESSJobExecutionDetails>\n"+
"</soapenv:Body>\n"+
"</soapenv:Envelope>";
System.out.println(payload);
returnstring=httpPost("https://<<localhost>>.oraclecloud.com/fscmService/ErpIntegrationService?invoke=",payload, "<<credentials>>");
Then i capture the response as :
InputStream in = conn.getInputStream();
InputStreamReader iReader = new InputStreamReader( in );
BufferedReader bReader = new BufferedReader(iReader);
String line;
String response = "";
String fresponse = "";
int lcount = 0;
while ((line = bReader.readLine()) != null)
{
lcount++;
response += line;
}
Then I cut out the xml response part and use only the attachment portion to perform the below tasks
Convert it into bytes and then try and save as zip
byte buf[] = response.getBytes();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
ZipEntry entry = new ZipEntry("abclog.zip");
entry.setSize(buf.length);
zos.putNextEntry(entry);
zos.write(buf);
zos.closeEntry();
zos.close();
java.io.FileOutputStream out_zip_file = new java.io.FileOutputStream("abclogfin.zip");
out_zip_file.write(baos.toByteArray());
The raw response is:
------=_Part_2737_547225473.1557335354007Content-Type: application/xop+xml;charset=UTF-8;
type="text/xml"Content-Transfer-Encoding: 8bitContent-ID: <3196f51c-0526-4921-bde2-d8f8453a255a>
<?xml version="1.0" encoding="UTF-8" ?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<env:Header><wsa:Action>http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService//
ErpIntegrationService/downloadESSJobExecutionDetailsResponse</wsa:Action><wsa:MessageID>urn:uuid:db614b6f-cee2-4218-9921-177fa5b71c32</wsa:MessageID>
</env:Header><env:Body><ns0:downloadESSJobExecutionDetailsResponse xmlns:ns0="http://xmlns.oracle.com/apps/financials/commonModules/shared/model/
erpIntegrationService/types/"><ns2:result xmlns:ns2="http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/types/"
xmlns:ns1="http://xmlns.oracle.com/adf/svc/types/" xmlns:ns0="http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns0:DocumentDetails"><ns0:Content><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:8a49811c-492b-4a51-aab2-16abdaf21ad3"/></ns0:Content><ns0:FileName xsi:nil="true"/><ns0:ContentType>zip</ns0:ContentType><ns0:DocumentTitle>ESS_L_13077
</ns0:DocumentTitle><ns0:DocumentAuthor>*****</ns0:DocumentAuthor><ns0:DocumentSecurityGroup>Attachments</ns0:DocumentSecurityGroup><ns0:DocumentAccount xsi:nil="true"/>
<ns0:DocumentName>13077.zip</ns0:DocumentName><ns0:DocumentId xsi:nil="true"/></ns2:result></ns0:downloadESSJobExecutionDetailsResponse></env:Body></env:Envelope>
------=_Part_2737_547225473.1557335354007Content-Transfer-Encoding: binaryContent-ID: <8a49811c-492b-4a51-aab2-16abdaf21ad3>PK
As per my understanding, the values after
<8a49811c-492b-4a51-aab2-16abdaf21ad3>PK
is the attachment, But I am not able to download it. After doing the above process, i get a zip file of 5KB but no contents inside the file.
Ok, SO i got the solution, after a lot of searching around. Posting it here.
Reference:
https://www.programcreek.com/java-api-examples/index.php?api=javax.xml.soap.AttachmentPart
SOlution Code:
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Base64;
import java.util.Iterator;
import javax.xml.soap.*;
public class SOAPClientSAAJ
{
// SAAJ - SOAP Client Testing
public static void main(String args[])
{
String soapEndpointUrl = "https://<<localhost>>.oraclecloud.com/fscmService/ErpIntegrationService";
//This action url will change as per the function you are calling
String soapAction = "http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/downloadESSJobExecutionDetails";
String jobid = "13077";
String optype = "log";
String line;
String response = "";
String reqresponse = callSoapWebService(soapEndpointUrl, soapAction, jobid, optype);
if(reqresponse.indexOf("Error")==-1)
{
Reader inputString = new StringReader(reqresponse);
BufferedReader bReader = new BufferedReader(inputString);
int lcount = 0;
try
{
while ((line = bReader.readLine()) != null)
{
lcount++;
if(lcount == 6 || lcount ==7)
{
response += line;
}
}
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(response);
}
private static void createSoapEnvelope(SOAPMessage soapMessage, String jobid, String optype) throws SOAPException
{
SOAPPart soapPart = soapMessage.getSOAPPart();
//Create this based on the SOAP request XML, you can use SOAP UI to get the XML as you like
String myNamespace = "typ";
String myNamespaceURI = "http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/types/";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("downloadESSJobExecutionDetails", myNamespace);
SOAPElement requestId = soapBodyElem.addChildElement("requestId", myNamespace);
requestId.addTextNode(jobid);
SOAPElement fileType = soapBodyElem.addChildElement("fileType", myNamespace);
fileType.addTextNode(optype);
}
private static String callSoapWebService(String soapEndpointUrl, String soapAction, String jobid,String optype)
{
String returnvalue="";
try
{
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
SOAPMessage soapRequest = createSOAPRequest(soapAction, jobid, optype);
SOAPMessage soapResponse = soapConnection.call(soapRequest, soapEndpointUrl);
// Print the SOAP Response
//System.out.println("Response SOAP Message:");
//soapResponse.writeTo(System.out);
//System.out.println();
/******extract zip****/
try
{
int numOfAttachments = soapResponse.countAttachments();
Iterator<?> attachments = soapResponse.getAttachments();
StringBuilder buf = new StringBuilder("Number of attachments: ");
buf.append(numOfAttachments);
int count = 1;
while (attachments.hasNext())
{
AttachmentPart attachment = (AttachmentPart) attachments.next();
buf.append(" | #").append(count);
buf.append(" | Content Location: ").append(attachment.getContentLocation());
buf.append(" | Content Id: ").append(attachment.getContentId());
buf.append(" | Content Size: ").append(attachment.getSize());
buf.append(" | Content Type: ").append(attachment.getContentType());
buf.append(" | Content String: ").append(attachment.toString());
count++;
//getting the file to particular Driver Name(C drive ,D drive)
//OutputStream fos = new FileOutputStream(new File("D:\\tmp\\fresponse_2048.zip"));
java.io.FileOutputStream out_file = new java.io.FileOutputStream("D:\\tmp\\"+jobid+".zip");
out_file.write(attachment.getRawContentBytes());
out_file.close();
}
//System.out.println(buf.toString());
}
catch (SOAPException e)
{
System.out.println(e.getMessage());
}
/****extract zip*****/
soapConnection.close();
/**write to a variable**/
ByteArrayOutputStream stream = new ByteArrayOutputStream();
soapResponse.writeTo(stream);
returnvalue = new String(stream.toByteArray(), "utf-8");
}
catch (Exception e)
{
returnvalue="Error occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!";
}
return returnvalue;
}
private static SOAPMessage createSOAPRequest(String soapAction, String jobid, String optype) throws Exception
{
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage, jobid, optype);
String authstr = "<<userid>>:<<password>>";
byte[] authBytes = authstr.getBytes("UTF-8");
String auth = Base64.getEncoder().encodeToString(authBytes);
//String authorization = new sun.misc.BASE64Encoder().encode((username+":"+password).getBytes());
//MimeHeaders hd = message.getMimeHeaders();
//hd.addHeader("Authorization", "Basic " + authorization);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("Authorization", "Basic " + auth);
headers.addHeader("SOAPAction", soapAction);
soapMessage.saveChanges();
/* Print the request message, just for debugging purposes */
//System.out.println("Request SOAP Message:");
//soapMessage.writeTo(System.out);
//System.out.println("\n");
return soapMessage;
}
}
Adding comments as requested by #Marco
#Marco This is the endpoint url for oracle cloud :
String soapEndpointUrl = "https://<>.oraclecloud.com/fscmService/ErpIntegrationService";
This is the job that will be executed within oracle cloud, this job lets us download the log files
String soapAction = "http://xmlns.oracle.com/apps/financials/commonModules/shared/model/erpIntegrationService/downloadESSJobExecutionDetails";
This specifies which job's log file we are trying to download
String optype="log"
String jobid="123123"
Function createSOAPRequest:
calls createSoapEnvelope function to create a SOAP request XML
used to authenticate using userid/pwd and adding it to the header
Function callSoapWebService:
calls the createSOAPRequest function
then based on the response, tries to download the attachment
Uses javax.xml.soap.* especially the javax.xml.soap.SOAPFactory class to create the SOAP request (https://www.tutorialspoint.com/java/xml/javax_xml_soap_soapfactory.htm),
Uses javax.xml.soap.SOAPConnectionFactor to create a SOAP Connection
SOAPMessage soapRequest = createSOAPRequest(soapAction, jobid, optype); --> creates the soap request
SOAPMessage soapResponse = soapConnection.call(soapRequest, soapEndpointUrl);
--> the o/p of the createSOAPRequest call is passed to soapConnection along with the end point url
--> the o/p of createSOAPRequest is basically the XML request one usually sends in SOAPUI
I have written a java code using Jdeveloper tool to call external web service. When I am running my code from Jdeveloper it is working fine. But I am deploying my code on Oracle weblogic 10.3.6 server and try to run this code then It is giving me below error -
javax.xml.soap.SOAPException: Content-Type not specified
Here is my code -
public static String callTestService(String soapRequestXml, String url) {
try{
final boolean isHttps = url.toLowerCase().startsWith("https");
HttpsURLConnection httpsConnection = null;
// Open HTTPS connection
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
if (isHttps) {
// Create SSL context and trust all certificates
SSLContext sslContext = SSLContext.getInstance("SSL");
//TrustManager[] trustAll= new TrustManager[] {new TrustAllCertificates()};
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Set trust all certificates context to HttpsURLConnection
HttpsURLConnection
.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
// Open HTTPS connection
// URL url1 = new URL(url);
URL url1 = new URL(null, url, new sun.net.www.protocol.https.Handler());
httpsConnection = (HttpsURLConnection) url1.openConnection();
// Trust all hosts
// httpsConnection.setHostnameVerifier(new TrustAllHosts());
// Connect
//Use below (2 lines) if Host name verification needs to turned off
MyHostnameVerifier HostVerifier = new MyHostnameVerifier();
httpsConnection.setHostnameVerifier(HostVerifier);
httpsConnection.connect();
}
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
System.out.println("create connection");
// SOAPMessage soapRequest = MessageFactory.newInstance().createMessage(new MimeHeaders(),
// new ByteArrayInputStream(soapRequestXml.getBytes()));
SOAPMessage soapRequest = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(new MimeHeaders() ,
new ByteArrayInputStream(soapRequestXml.getBytes(Charset.forName("UTF-8"))));
// SOAPMessage s = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
// SOAPPart soapPart = soapRequest.getSOAPPart();
// SOAP Envelope
// SOAPEnvelope envelope = soapPart.getEnvelope();
// envelope.addNamespaceDeclaration("Dokumentai", "http://vmi.lt/ais/xsd/daa");
// MessageFactory messageFactory = MessageFactory.newInstance();
//SOAPMessage soapRequest = messageFactory.createMessage(new MimeHeaders(),soapRequestXml);
// MessageFactory messageFactory = MessageFactory.newInstance();
// SOAPMessage soapRequest = messageFactory.createMessage();
// SOAPPart soapPart = soapRequest.getSOAPPart();
// SOAPEnvelope envelope = soapPart.getEnvelope();
// SOAPBody soapBody = envelope.getBody();
//soapBody.setTextContent(soapRequestXml);
// soapRequest.setContentDescription(soapRequestXml);
// SOAPPart soapPart = soapRequest.getSOAPPart();
//SOAPEnvelope envelope = soapPart.getEnvelope();
// String serverURI = "myhost";
// envelope.addNamespaceDeclaration("xmlns",
// "http://vmi.lt/ais/xsd/daa");
// SOAP Envelope
// SOAPEnvelope envelope = soapPart.setContent(soapRequestXml);
// System.out.println("SOAP "+ soapRequest.writeTo(System.out));
MimeHeaders headers = soapRequest.getMimeHeaders();
headers.setHeader("SOAPAction",
"http://vmi.lt/ais/ws/handleMessage");
MimeHeaders headers1 = soapRequest.getMimeHeaders();
headers1.setHeader("Content-Type", "application/soap+xml; charset=utf-8");
soapRequest.saveChanges();
soapRequest.writeTo(System.out);
System.out.println("call request url");
// Send SOAP Message to SOAP Server
SOAPMessage soapResponse = soapConnection.call(soapRequest, url);
soapResponse.setProperty("Content-Type", "application/xml; charset=utf-8");
soapResponse.setContentDescription("application/xml; charset=utf-8");
ByteArrayOutputStream soapResponseBaos = new ByteArrayOutputStream();
soapResponse.writeTo(soapResponseBaos);
String soapResponseXml = soapResponseBaos.toString();
return soapResponseXml;
}catch(Exception e){
return e.toString();
}
}
I have tried many different things but it works fine when i call web service directly from Jdeveloper but fails when I call from Oracle web logic server.
Could you please help me with this?
I have fixed this issue.Please make following changes in the code.
MimeHeaders headers1 = new MimeHeaders();
headers1.setHeader("Content-Type", "text/xml");
headers1.setHeader("Encoding", "UTF-8");
// SOAPMessage soapRequest =
// MessageFactory.newInstance().createMessage(new MimeHeaders(),
// new ByteArrayInputStream(soapRequestXml.getBytes(Charset.forName("UTF-8"))));
SOAPMessage soapRequest = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createMessage(headers1 ,
new ByteArrayInputStream(soapRequestXml.getBytes(Charset.forName("UTF-8"))));
i'm making a webservice client with SAAJ java.
I'n the client i ask info of the webservice. But the webservice is protected with a username and password.
And i don't no how i must add these 2.
I tried it in my code ( see commands ) but no results ..
// SAAJ - SOAP Client Testing
public static void main(String args[]) {
String soapEndpointUrl = "https://gtstvs01:8443/aeosws";
String soapAction = "";
callSoapWebService(soapEndpointUrl, soapAction);
}
private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
SOAPPart soapPart = soapMessage.getSOAPPart();
String myNamespace = "sch";
String myNamespaceURI = "http://www.nedap.com/aeosws/schema";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);
//SOAPFactory soapFactory = SOAPFactory.newInstance();
// SOAPElement authHeaderElement = soapFactory.createElement("AuthenticationHeader", "administrator", "aeosrules");
//SOAPElement sessionIdElement = soapFactory.createElement("SessionID", "nsprefix", "nsuri");
//sessionIdElement.addTextNode(MY_SESSION_ID);
//authHeaderElement.addChildElement(sessionIdElement);
//SOAPHeader soapHeader = envelope.addHeader();
//soapHeader.addChildElement(authHeaderElement);
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("EmployeeSearchInfo", myNamespace);
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("EmployeeInfo", myNamespace);
SOAPElement soapBodyElem2 = soapBodyElem1.addChildElement("FirstName", myNamespace);
soapBodyElem2.addTextNode("Jens");
}
private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
try {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);
// Print the SOAP Response
System.out.println("Response SOAP Message:");
soapResponse.writeTo(System.out);
System.out.println();
soapConnection.close();
} catch (Exception e) {
System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
e.printStackTrace();
}
}
private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", soapAction);
soapMessage.saveChanges();
/* Print the request message, just for debugging purposes */
System.out.println("Request SOAP Message:");
soapMessage.writeTo(System.out);
System.out.println("\n");
return soapMessage;
}
From what I understand, you have to add it to the header.
In your code for CreateSoapRequest you need 3 additional lines.
MimeHeaders headers = soapMessage.getMimeHeaders();
String encoded = new sun.misc.BASE64Encoder().encode((username+":"+password).getBytes());
String authString = "Basic " + encoded;
headers.addHeader("Authorization", authString);
headers.addHeader("SOAPAction", soapAction);
I think it matters what type of encoding the site has. So this probably won't work in a cut and paste you have to figure out what it requires.
I have a developED a REST Api with Java and one of the service needs to make a SOAP call to an endpoint. For this I implemented SAAJ client to create the whole xml message. However each time a call consume extra 1 MB of memory.
import javax.xml.soap.*;import javax.xml.transform.* import javax.xml.transform.stream.*;
public class SOAPClientSAAJ {
public void makeCall() {
try {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
// Process the SOAP Response
printSOAPResponse(soapResponse);
soapConnection.close();
} catch (Exception e) {
System.err.println("Error occurred while sending SOAP Request to Server");
e.printStackTrace();
}
}
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "http://ws.cdyne.com/";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("example", serverURI);
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example");
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example");
soapBodyElem1.addTextNode("mutantninja#gmail.com");
SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example");
soapBodyElem2.addTextNode("123");
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "VerifyEmail");
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message = ");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
/**
* Method used to print the SOAP Response
*/
private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.print("\nResponse SOAP Message = ");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
}}
When a call this SOAP service in my rest object and run piece of memory detector ;
public void restService(){
SOAPClientSAAJ test= new SOAPClientSAAJ();
test.makeCall();
Runtime runtime = Runtime.getRuntime();
runtime.gc();
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Used memory is bytes: " + memory);
}
It shows each call consume 1 MB memory and at the end the Rest application crush. I debug it many times and saw that SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url); this part highly is the cause of the leak but I couldn't find a solution. Any help about that would be great.
I have a simple SOAP webservice server like this:
public class receiver extends JAXMServlet implements ReqRespListener {
public SOAPMessage onMessage(SOAPMessage soapm) {
return soapm;
}
}
In the client I send a message to this server:
public class sender {
/** This is a sample web service operation */
SOAPConnectionFactory scfac = null;
SOAPConnection con =null;
MessageFactory fac = null;
SOAPMessage message = null;
SOAPMessage response = null;
#WebMethod(operationName = "sender")
public String sender(#WebParam(name = "a") String a)
{
try{
//Creat Connection
scfac = SOAPConnectionFactory.newInstance();
con = scfac.createConnection();
fac = MessageFactory.newInstance();
message = fac.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPHeader header = envelope.getHeader();
header.detachNode();
SOAPBody body = envelope.getBody();
body.addTextNode(a);
URL endpoint = new URL("http://localhost:8080/Target/receiver");
//log("Bat dau gui");
response = con.call(message, endpoint);
//log("Da nhan ve");
SOAPPart sp = response.getSOAPPart();
SOAPEnvelope ev = sp.getEnvelope();
SOAPBody bd = ev.getBody();
String result = bd.getValue();
return result;
}
catch (Exception e)
{
String fail = "Fail to send";
return fail;
}
}
}
I called the sender function in a jsp file and passed a String to it.
I had built it with Netbeans and Tomcat server but it just responds with a null message.
How can I fix the problem?
I had fixed the problem by 2 steps:
The SOAP server: In the web.xml file fix the servlet class from com.sun.xml.ws.transport.http.servlet.WSServlet to your own Java class (in my case it is receive.receiver)
Add saaj-impl-1.3.1 library to NetBeans (the library with method com.sun.xml.messaging)