Why am I receiving java.lang.NullPointerException rather than soap response?

21,013

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

See http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java#HttpSOAPConnection.call%28javax.xml.soap.SOAPMessage%2Cjava.lang.Object%29 Lines 281 to 341.

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

Share:
21,013
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    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
    Admin over 10 years
    I am using the same code for other web service but this one does not work.
  • Chaffers
    Chaffers over 10 years
    Is 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
    Chaffers over 10 years
    Are 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/open‌​jdk/…
  • Admin
    Admin over 10 years
    it 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
    Admin over 10 years
    but I am using exactly same code for another web service and it works
  • Admin
    Admin over 10 years
    actually I am using the same code for another web service which perfectly works.
  • rajivas
    rajivas over 10 years
    If 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
    Admin over 10 years
    I'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
    Admin over 10 years
    I'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
    rajivas over 10 years
    can you list the SAAJ Jars you are using.. Also let me know if you have SAAJ-Impl jar in classpath.
  • Admin
    Admin over 10 years
    I've added the content of my pom.xml to the question
  • Dario
    Dario over 10 years
    I 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
    Chaffers over 10 years
    Exactly 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?