5

我正在向服务器发送以下请求,当我复制请求并使用 SOAPUI 时,它会显示正确的响应,

但是当我使用以下代码生成并发送它时,返回

java.lang.NullPointerException

在第 50 行,即

sm.writeTo(out);

代码:

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());

马文

 <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>
4

4 回答 4

2

如果您在第 50 行遇到 NullPointerException,那是因为st为空。那就是connection.call(message, endpoint); 正在返回 null。

假设您使用的是 SOAPConnection 的默认实现(com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory - 请参阅http://grepcode.com/file/repository.grepcode.com/java/root/jdk /openjdk/6-b14/javax/xml/soap/SOAPConnectionFactory.java - 第 47-48 行)方法call(...)可以返回 null的原因有几个:

  • 您收到的响应代码既不是 HttpURLConnection.HTTP_INTERNAL_ERROR (500) 也不是 HttpURLConnection.HTTP_OK (200)
  • 响应码正确但未返回回复信息

请参阅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第 281 到 341 行。

我无法进一步分析,因为我无法重现该问题。我建议您下载相关 Java 类的源代码,将其链接到您的调试器并在调试模式下执行它,以查看您的用例中实际发生的情况。

于 2013-11-23T17:54:52.513 回答
1

您正在使用的类 SOAPMessage 是抽象的,方法 writeTo() 也是如此。这意味着除了方法定义(类似于 C 中的函数原型)之外没有其他代码。内部(方法的花括号内)是空的。要解决您的问题,您需要在新类中扩展 SOAPMessage 类并提供其中方法的实现。

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.
}

这里的抽象基础知识:http: //docs.oracle.com/javase/tutorial/java/IandI/abstract.html

于 2013-11-21T01:27:44.217 回答
0

SOAPConnection.call() 是抽象的,不是吗?

您必须子类化该类,提供其抽象方法的具体实现,然后实例化它。

否则,您将最终得到 NPE,因为您无法实例化抽象类。

于 2013-11-19T07:41:48.860 回答
0

通过放置 system.out.println("soap message:" +sm) 检查 sm 是否为空

如果响应为空,请检查此 message.writeTo(System.out); 声明将打印。它还会提示您的肥皂请求是否正确

使用 Eclipse TCP/IP 监视器或通过其他方式(启用跟踪日志记录)捕获您发送到端点的低级别 http 请求。很可能您的 SOAP 请求格式不正确,因此服务器无法发回响应。

于 2013-11-21T06:34:15.013 回答