使用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

+0

你能使用soap客户端进行成功的调用(那些现成的测试一次) – DevZer0

+0

@devzero我知道我们在.Net中的另一个应用程序正在访问这个Web服务,没有任何问题。我将着眼于用另一个SOAP客户端尽快测试。 – TekiusFanatikus

采取在WSDL文件第二次看,在某个地方,你会看到这样的事情:

<element name="queryByPartyId"> 
    <complexType> 
     <element name="foobar" type="foo:int"/> 
    </complexType> 
</element> 

这是一个什么样的服务期望在调用时传递的说明。内部elements具有nametype属性。要翻译成打电话,只是这样做:

$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(这意味着一个数组)

+0

查看更新#2,找到了您所指的信息(TIL关于模式位置)...找到了 – TekiusFanatikus

+1

解决方案!感谢您的帮助,请参阅更新#3!谢谢! – TekiusFanatikus