为什么我收到的是java.lang.NullPointerException而不是soap响应?

为什么我收到的是java.lang.NullPointerException而不是soap响应?,java,soap,soapui,soap-client,Java,Soap,Soapui,Soap Client,我正在向服务器发送以下请求,当我复制请求并使用SOAPUI时,它会显示正确的响应 但是当我使用下面的代码生成并发送它时,返回 java.lang.NullPointerException 在第50行,这是 sm.writeTo(out); 代码: 马文 http://maven.apache.org META-INF src jax-ws-catalog.xml wsdl/** src/main/resources org.jvnet.jax-ws-commons jaxws-maven插件

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

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

java.lang.NullPointerException
在第50行,这是

sm.writeTo(out);
代码:

马文

http://maven.apache.org
META-INF
src
jax-ws-catalog.xml
wsdl/**
src/main/resources
org.jvnet.jax-ws-commons
jaxws-maven插件
2.2.1
javax.xml
webservicesapi
1.4
${project.build.directory}/generated sources/jaxws-wsimport
真的
真的
真的
${basedir}/src/jax-ws-catalog.xml
UTF-8
朱尼特
朱尼特
3.8.1
测试
org.jdom
Java文档对象模型
1.1
罐子
com.sun.xml.ws
Web服务rt
1.4
编译
SOAPConnection.call()是抽象的,不是吗

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


否则,您将使用NPE,因为您无法实例化抽象类。

您使用的类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.
}

这里的抽象基础:

通过放置system.out.println(“soap消息:+sm”)检查sm是否为null

如果响应为空 检查此消息的内容。writeTo(System.out);报表将打印出来。 它还将提示您的soap请求是否格式正确


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

如果第50行出现NullPointerException,那是因为st为null。这就是connection.call(消息、端点);正在返回null

假设您使用的是SOAPConnection的默认实现(com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnectionFactory- 见第47-48行) 方法调用(…)可以返回null的原因如下:

  • 您收到的响应代码既不是HttpURLConnection.HTTP_INTERNAL_ERROR(500),也不是HttpURLConnection.HTTP_OK(200)
  • 响应代码正确,但未返回任何回复消息
请参见第281至341行


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

您能提供完整的stacktrace吗?因为它与SAAJ from的示例非常相似,并且它需要实际的提供者(
SAAJ impl.jar
或替代方法,例如)方法connection.call很可能返回null而不是响应。请pusblish您的stacktrace。@mwhs我在另一个Web服务中使用了相同的代码,并且工作了。不确定为什么会显示此错误。它只显示“java.lang.NullPointerException”,如果可行,请尝试
sm.writeTo(System.out)
。可能您的OutputStream对象
out
为空。第50行有两个对象可以为空:
sm
out
。因为
sm.writeTo(系统输出)
获取相同的错误,
sm
为空
sm
等于
response
,等于
connection.call(消息,端点)
.call()
返回“作为对所发送消息的响应的SOAPMessage对象”。因此,您没有收到来自服务器的任何响应。我正在对其他web服务使用相同的代码,但此代码不起作用。这是您正在调用的java web服务还是某种本机代码?无论哪种方式,为什么不使用wsdl并从中生成客户机?您是否绝对确定您的其他代码没有使用HTTPSoapConnection或WebServicesTempate?您正在调用的代码是抽象的,因此实现不存在,只存在空方法。实际上,我正在为另一个完美工作的web服务使用相同的代码。完全相同的代码,或者其中是否存在多态类型?SOAPConnection=new-HttpSoapConnection,或者更可能的是SOAPConnection在您自己的代码中或从导入中被重写。因此,检查包并在导入中键入,它肯定是javax.xml.soap.SOAPConnection,还是仅仅是另一个包中的SOAPConnection对象?这真的很奇怪,sm为null,我检查了TCP/IP监视器发送的请求,这是正确的请求,因为我可以在SoapUI中收到响应。如果您有权访问webservice服务器,请在服务器上检查您发送的请求会发生什么情况。验证它是否正在处理请求并发送有效响应。我已使用SoapUI进行了验证,我在控制台上打印了请求,并将其复制到SoapUI中,SoapUI接收到正确的响应,因此将发送正确的请求,我已联系searver团队,他们告诉我这可能是由于代理设置,但我没有配置任何代理设置扫描您列出您正在使用的SAAJ JAR。。如果你在类路径中有SAAJ Impl jar,也请告诉我。我已经在问题中添加了pom.xml的内容,但是我在另一个web服务中使用了完全相同的代码,并且它可以工作。我已经得到了你解释的第一部分,但不是最后一部分,你能给我一个例子吗
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.
}