web服务客户机之间的差异导致一次成功(JAXWS)一次错误(AXIS)



web服务客户机之间的差异导致一次成功一次错误我有一个基于wsdl,在tomcat上使用JAXWS 2.2构建的web服务。基于此wsdl,我创建了一个运行良好的客户端。
但是当我从外部客户端获得web服务时,我在服务器上出现了错误,我嗅了嗅网络,发现了差异但是我不知道它们有多重要,因为我从外部请求中看到它们使用AXIS来构建客户端。对于tomcat异常,根据服务器端的日志,我知道它到达了服务,但在一个stub方法中失败了下面是我的客户端服务:

POST /console/ws/APIEndpoint HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://foo.com/ServerApi/sendMessageRequest"
User-Agent: JAX-WS RI 2.2.5-b01 
Host: 192.168.3.69:18112
Connection: keep-alive
Content-Length: 1221
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns3:sendMessage xmlns:ns2="http://www.foo.com" xmlns:ns3="http://www.foo.com/">
<NP_MESSAGE>
<ns2:HEADER>
<REQUEST_ID>NPAABBYYMMDDXXXXXZZZZ</REQUEST_ID>
<PROCESS_TYPE>PORT</PROCESS_TYPE>
<MSG_TYPE>Publish</MSG_TYPE>
<TRX_NO>MI000004548992</TRX_NO>
<VERSION_NO>1</VERSION_NO>
<RETRY_NO>2</RETRY_NO>
<RETRY_DATE>2011-11-03T11:48:23.769+02:00</RETRY_DATE>
<FROM>MI</FROM>
<TO>aa</TO>
</ns2:HEADER>
<BODY>
</BODY>
</NP_MESSAGE>
</ns3:sendMessage>
</S:Body>
</S:Envelope>

,现在这是来自外部客户端的请求,不工作:

POST /console/ws/APIEndpoint HTTP/1.1
Host: 46.31.96.42:18112
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: "http://foo.com/sendMessage"
Content-Length: 1197
Max-Forwards: 10
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<sendMessage xmlns="http://foo.com/">
<NP_MESSAGE>
<ns1:HEADER xmlns:ns1="http://foo.com">
<REQUEST_ID xmlns="">NPMICL111103350390001
</REQUEST_ID>
<PROCESS_TYPE xmlns="">PORT</PROCESS_TYPE>
<MSG_TYPE xmlns="">Publish</MSG_TYPE>
<TRX_NO xmlns="">MI000004554248</TRX_NO>
<VERSION_NO xmlns="">1</VERSION_NO>
<RETRY_NO xmlns="">2</RETRY_NO>
<RETRY_DATE xmlns="">2011-11-03T13:00:06.659+02:00</RETRY_DATE>
<FROM xmlns="">MI</FROM>
<TO xmlns="">TZ</TO>
</ns1:HEADER>
<BODY xmlns="">
</BODY>
</NP_MESSAGE>
</sendMessage>
</soapenv:Body>
</soapenv:Envelope> 

从tomcat得到的异常如下所示:

 03/11/2011 12:33:43 com.sun.xml.ws.server.sei.EndpointMethodHandler invoke
SEVERE: null
java.lang.NullPointerException
        at com.foo.gw.ServiceApi.sendMessage(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:250)
        at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:150)
        at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:261)

, tomcat返回:HTTP/1.1 500 Internal Server Error

我注意到在头文件中一些参数在它们之间缺失,但在阅读了一些信息后,我不认为这是原因。因为请求确实到达了tomcat

中的服务

更新:这就是我想我得到的异常,我不能只调试分散的日志下面是我的service类的样子:

更新2:
我知道NP_MESSAGE是空的,但为什么我可以看到它从客户端获取数据

@WebService (targetNamespace="http://www.foo.com/")
public class Api {  
    Api()
    {
    }
    @WebResult(name="return_NP_ACK", partName="return_NP_ACK")
    @WebMethod(operationName = "sendMessage")
    public NPACK sendMessage(@WebParam(name = "NP_MESSAGE")NPMESSAGE NP_MESSAGE)
    {
    if(null != NP_MESSAGE)
{
    Logger.WriteLog("WebService NP_MESSAGE not null ",Level.DEBUG);

}
else
{
     //  I know that NP_MESSAGE is null im getting here !!!
    Logger.WriteLog("WebService NP_MESSAGE is null ",Level.DEBUG);
}
    HEADER hHeader = NP_MESSAGE.getHEADER();  <-- here is where the exception 
    ....
    ...
    }
}
更新3:


我发现了一些东西,但我不确定是不是我的箱子。如果它。我怎样才能解决这个问题。这是讨论AX-RPC与JAX-WS的链接。我不完全清楚这是不是我的案子。难道不是每个WS框架都假设总是从wsdl中创建可以对话的存根,不管它做了什么,就像CORBA这样的契约。从来不是我的…
无论如何我该如何修复它,我没有选择与AXIS一起工作。难道我不能直接告诉JAXWS使用axis协议吗?

我认为问题在这里的轴消息:

<sendMessage xmlns="http://foo.com/">
<NP_MESSAGE>

因为xmlns定义定义了默认名称空间,所以现在也在该名称空间中定义了NP_MESSAGE元素。但是,在jaxws消息中没有默认的名称空间,因此NP_MESSAGE元素没有名称空间

你可以试着把你所有的元素(WebParam, WebResult)放在同一个targetNamespace作为你的WebService

最新更新