使用PHP使用Java Web服务时获取NullPointerException
尝试使用PHP使用Java Web服务时出现以下错误:java.lang.NullPointerException
。我想it boils down to passing the parameter correctly。但是,这个链接在我的情况下不起作用(提供一个stdClass对象)。使用PHP使用Java Web服务时获取NullPointerException
这里是WSDL的相关部分
...
<message name="queryByPartyId">
<part name="parameters" element="tns:queryByPartyId"/>
</message>
...
<operation name="queryByPartyId">
<soap:operation soapAction=""/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
<fault name="ServiceFault"><soap:fault name="ServiceFault" use="literal"/></fault>
</operation>
相关PHP代码:
//things I've tried
//$theResponse = $soapClient->queryByPartyId("12345");
//$theResponse = $soapClient->__soapCall("queryByPartyId", array("queryByPartyId"=>12345));
//$theResponse = $soapClient->__soapCall("queryByPartyId", array("12345"));
//$addRequest = new stdClass();
//$addRequest->queryByPartyId = 12345;
//$theResponse = $soapClient->queryByPartyId($addRequest);
$theResponse = $soapClient->queryByPartyId(array("queryByPartyId"=>12345));
var_dump($theResponse);
的$theResponse
格式化的转储:
object(SoapFault)#9 (10) {
["message":protected]=> string(30) "java.lang.NullPointerException"
["string":"Exception":private]=> string(0) ""
["code":protected]=> int(0)
["file":protected]=> string(51) "/path/to/index.php"
["line":protected]=> int(82)
["trace":"Exception":private]=> array(2) {
[0]=> array(6) {
["file"]=> string(51) "/path/to/index.php"
["line"]=> int(82)
["function"]=> string(6) "__call"
["class"]=> string(10) "SoapClient"
["type"]=> string(2) "->"
["args"]=> array(2) {
[0]=> string(14) "queryByPartyId"
[1]=> array(1) {
[0]=> array(1) {
["queryByPartyId"]=> int(12345)
}
}
}
}
[1]=> array(6) {
["file"]=> string(51) "/path/to/index.php"
["line"]=> int(82)
["function"]=> string(14) "queryByPartyId"
["class"]=> string(10) "SoapClient"
["type"]=> string(2) "->"
["args"]=> array(1) {
[0]=> array(1) {
["queryByPartyId"]=> int(12345)
}
}
}
}
["previous":"Exception":private]=> NULL
["faultstring"]=> string(30) "java.lang.NullPointerException"
["faultcode"]=> string(8) "S:Server"
["detail"]=> object(stdClass)#6 (1) {
["exception"]=> object(stdClass)#7 (1) {
["stackTrace"]=> object(stdClass)#8 (1) {
["frame"]=> array(40) {
[0]=> string(0) ""
[1]=> string(0) ""
[2]=> string(0) ""
[3]=> string(0) ""
[4]=> string(0) ""
[5]=> string(0) ""
[6]=> string(0) ""
[7]=> string(0) ""
[8]=> string(0) ""
[9]=> string(0) ""
[10]=> string(0) ""
[11]=> string(0) ""
[12]=> string(0) ""
[13]=> string(0) ""
[14]=> string(0) ""
[15]=> string(0) ""
[16]=> string(0) ""
[17]=> string(0) ""
[18]=> string(0) ""
[19]=> string(0) ""
[20]=> string(0) ""
[21]=> string(0) ""
[22]=> string(0) ""
[23]=> string(0) ""
[24]=> string(0) ""
[25]=> string(0) ""
[26]=> string(0) ""
[27]=> string(0) ""
[28]=> string(0) ""
[29]=> string(0) ""
[30]=> string(0) ""
[31]=> string(0) ""
[33]=> string(0) ""
[35]=> string(0) ""
[36]=> string(0) ""
[37]=> string(0) ""
[38]=> string(0) ""
[39]=> string(0) ""
}
}
}
}
}
更新#1
WSDL评论:Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.7-b01-
。
更新#2
没有元素标记在WSDL中被发现,但架构的位置存在。在加载时,下面的元素标签被发现
<xs:complexType name="queryByPartyId">
<xs:sequence>
<xs:element name="queryByPartyIdInMsg" type="tns:queryByPartyIdInMessage" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="queryByPartyIdInMessage">
<xs:sequence>
<xs:element name="partyId" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
更新#3
解决方案:
$addRequest = new stdClass();
$queryByPartyIdInMsg = new StdClass();
$queryByPartyIdInMsg->partyId="12345";
$addRequest->queryByPartyIdInMsg = $queryByPartyIdInMsg;
$theResponse = $soapClient->queryByPartyId($addRequest);
var_dump($theResponse);
一旦找到元素结构,the link mentioned previously actually helped to find the solution。
采取在WSDL文件第二次看,在某个地方,你会看到这样的事情:
<element name="queryByPartyId">
<complexType>
<element name="foobar" type="foo:int"/>
</complexType>
</element>
这是一个什么样的服务期望在调用时传递的说明。内部elements
具有name
和type
属性。要翻译成打电话,只是这样做:
$response = $soapClient->queryByPartyId(array('foobar'=> 123456));
var_dump($response);
的WSDL 应该还含有什么样的服务将返回一个描述:
<element name="queryByPartyIdResponse">
<complexType>
<element name="PartyReturn" type="xs:SomeType" />
</complexType>
</element>
在这个例子中,响应将是一个对象(或任何您的soapclient返回)与1属性:PartyReturn
,该属性将是类型SomeType
。如果它是一个自定义类型(一个Java类),那么wsdl文件也会包含这个描述。
你的情况:
$response = $soapClient->queryByPartyId(
array('queryByPartyIdInMsg' => array('PartyId' => 123456))
);
或者,也许你需要的queryByPartyIdInMsg
子阵列换到另一个阵列,因为这两种复合类型具有0的minOccurs(这意味着一个数组)
查看更新#2,找到了您所指的信息(TIL关于模式位置)...找到了 – TekiusFanatikus
解决方案!感谢您的帮助,请参阅更新#3!谢谢! – TekiusFanatikus
你能使用soap客户端进行成功的调用(那些现成的测试一次) – DevZer0
@devzero我知道我们在.Net中的另一个应用程序正在访问这个Web服务,没有任何问题。我将着眼于用另一个SOAP客户端尽快测试。 – TekiusFanatikus