Why am I receiving java.lang.NullPointerException rather than soap response?
Solution 1
If you are having NullPointerException at line 50 it's because st is null. That is connection.call(message, endpoint); is returning null.
Assuming you are using the default implementation of SOAPConnection (com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory - See http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/xml/soap/SOAPConnectionFactory.java - Lines 47-48) There are just a few reasons method call(...) can return null:
- You are receiving a response code that is neither HttpURLConnection.HTTP_INTERNAL_ERROR (500) nor HttpURLConnection.HTTP_OK (200)
- The response code is correct but no reply message is returned
I can't go any further with the analysis because I'm not able to reproduce the issue. I suggest you download source code of involved java classes, link it to your debugger and execute it in debug mode to see what is actually happening in your usecase.
Solution 2
The class you are using, SOAPMessage, is abstract, as is the method writeTo(). This means there is no code other than the method definition (similar to a function prototype in C). The insides (inside the curly braces of the method) are empty. To fix your issue, you need to extend the SOAPMessage class in a new class and provide implementation for the methods therein.
public class myMessage extends SOAPMessage {
public void writeTo(OutputStream out) throws SOAPException, IOException {
// your code goes here
}
// All other methods in the superclass implemented here.
}
Basics of abstraction here: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Admin
Updated on July 09, 2022Comments
-
Admin almost 2 years
I am sending the following request to the server, when I copy the request and use the SOAPUI it shows the correct response,
but when I use the following code to generate and send it, returns
java.lang.NullPointerException
on line 50, which is
sm.writeTo(out);
code:
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); SOAPFactory soapFactory = SOAPFactory.newInstance(); MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); SOAPHeader header = message.getSOAPHeader(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); SOAPBody body = soapEnvelope.getBody(); header.removeNamespaceDeclaration(header.getPrefix()); soapEnvelope.addNamespaceDeclaration("v9", "ADDRESS OF SERVICE"); Name bodyName; bodyName = soapFactory.createName("User"); SOAPElement getList = body.addChildElement("User", "v9"); Name childName; getList.addChildElement("name", "v9").addTextNode("Alex"); getList.addChildElement("surname", "v9").addTextNode("Nicroid"); message.writeTo(System.out); URL endpoint = new URL("ENDPOINT ADDRESS OF SERVER"); SOAPMessage response = connection.call(message, endpoint); connection.close(); SOAPMessage sm = response; ByteArrayOutputStream out = new ByteArrayOutputStream(); sm.writeTo(out); //java.lang.NullPointerException System.out.println(out.toString());
Maven
<url>http://maven.apache.org</url> <build> <resources> <resource> <targetPath>META-INF</targetPath> <directory>src</directory> <includes> <include>jax-ws-catalog.xml</include> <include>wsdl/**</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> <plugins> <plugin> <groupId>org.jvnet.jax-ws-commons</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>2.2.1</version> <dependencies> <dependency> <groupId>javax.xml</groupId> <artifactId>webservices-api</artifactId> <version>1.4</version> </dependency> </dependencies> <configuration> <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir> <xnocompile>true</xnocompile> <verbose>true</verbose> <extension>true</extension> <catalog>${basedir}/src/jax-ws-catalog.xml</catalog> </configuration> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jdom</groupId> <artifactId>jdom</artifactId> <version>1.1</version> <type>jar</type> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>webservices-rt</artifactId> <version>1.4</version> <scope>compile</scope> </dependency> </dependencies> </project>
-
Admin over 10 yearsI am using the same code for other web service but this one does not work.
-
Chaffers over 10 yearsIs this a java webservice you are calling or some sort of native code? Either way why not consume the wsdl and generate a client from that?
-
Chaffers over 10 yearsAre you absolutely sure your other code doesn't use a HTTPSoapConnection or a WebServicesTempate? The code you are calling is abstract, hence the implementation does not exist, just empty methods. grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
-
Admin over 10 yearsit is really weird, sm is null and I checked the request sent by TCP/IP monitor it is a correct request, as I could receive the response in SoapUI.
-
Admin over 10 yearsbut I am using exactly same code for another web service and it works
-
Admin over 10 yearsactually I am using the same code for another web service which perfectly works.
-
rajivas over 10 yearsIf you have access to webservice server Check at server what happens to the request u sent. Verify whether it is processing the request and sending valid response.
-
Admin over 10 yearsI've verified it using SoapUI, I print out the request on console, and copy it in SoapUI which receives a correct response, therefore a correct request will be sent, I've contacted the searver team,they advised me that it can be due to proxy settings but I did not configure any of proxy settings
-
Admin over 10 yearsI've got the first part of your explanation but not the last part, would you give me an example of that, I am not sure what you mean by "download the source code of involved java classes, link ..."
-
rajivas over 10 yearscan you list the SAAJ Jars you are using.. Also let me know if you have SAAJ-Impl jar in classpath.
-
Admin over 10 yearsI've added the content of my pom.xml to the question
-
Dario over 10 yearsI was thinking about something like this: stackoverflow.com/a/1961628/3008950 applied to the saaj implementation you are using (instead of junit.jar as mentioned in that post)... Usually it can help but honestly I'm afraid this time it's not so straightforward as I expected (I tried that with rt.jar but I'm having issues: the debugger is showing me the source code of the class but it doesn't seem to highlight the line of code it's executing)... but maybe you can figure out how to make it work.
-
Chaffers over 10 yearsExactly the same code or is there a polymorphic type in there? Something along the lines of SOAPConnection = new HttpSoapConnection, or possibly more likely SOAPConnection is overridden in either your own code or from an import. Hence check the package and type in your imports, is it definitely javax.xml.soap.SOAPConnection, or merely a SOAPConnection object in a different package?