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

不问归期 提交于 2019-12-22 07:00:02

问题


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>

回答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.




回答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




回答3:


SOAPConnection.call() is abstract is it not?

You must subclass the class, provide concrete implementations of it's abstract methods and then instantiate it.

Otherwise you will end up with NPEs as you cannot instantiate an abstract class.




回答4:


check whether sm is null by placing system.out.println(" soap message:" +sm)

if response is null check what this message.writeTo(System.out); statement will print. It will also give hint about your soap request is well formed or not

capture the low level http request you are sending to the endpoint using eclipse TCP/IP monitor or through other means (enable trace logging). most probably your SOAP request might not be well formed so, server failing to send response back.



来源:https://stackoverflow.com/questions/19953829/why-am-i-receiving-java-lang-nullpointerexception-rather-than-soap-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!