将php异常(soap故障)转换为特定的类(Convert php exception (soap fault) to a specific class)

编程入门 行业动态 更新时间:2024-10-28 18:23:36
将php异常(soap故障)转换为特定的类(Convert php exception (soap fault) to a specific class)

我遇到问题将一个PHP异常转换为泛型类。

我正在调用一个Web服务方法,当它失败时,它将返回带有“detail标记”中的信息的soap错误。 如果我使用Soap UI(http://soapui.org)调用Web服务方法,结果如何:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <s:Fault> <faultcode>s:Client</faultcode> <faultstring xml:lang="sv-SE">Error Posting New Sponsor Full to Middleware</faultstring> <detail> <MyPlanWSError xmlns="http://schemas.datacontract.org/2004/07/MyPlanPOA" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <BadParameters i:nil="true"/> <Details>2 duplicate(s) detected</Details> <Duplicates> <DuplicateInfo> <DuplicatedExtRelNo>0</DuplicatedExtRelNo> <POAStatus>New</POAStatus> <Source>NewExtRels</Source> <SourceRecordID>194</SourceRecordID> <Type>eMail</Type> </DuplicateInfo> <DuplicateInfo> <DuplicatedExtRelNo>0</DuplicatedExtRelNo> <POAStatus>New</POAStatus> <Source>NewExtRels</Source> <SourceRecordID>194</SourceRecordID> <Type>Address</Type> </DuplicateInfo> </Duplicates> <ErrorNumber>7</ErrorNumber> </MyPlanWSError> </detail> </s:Fault> </s:Body> </s:Envelope>

我想获取“detail”标签中的MyPlanWSError内容。 我想将其转换为一个PHP类。

我使用了很好的工具wsdl2php(http://www.urdalen.no/wsdl2php)来生成基于wsdl文件的帮助类,这样我就不必自己编写所有的代码:)该工具生成了MyPlanWSError,它看起来像这样:

class MyPlanWSError { public $BadParameters; public $Details; public $Duplicates; public $ErrorNumber; public function __construct($BadParameters, $Details, $Duplicates, $ErrorNumber) { $this->BadParameters = $BadParameters; $this->Details = $Details; $this->Duplicates = $Duplicates; $this->ErrorNumber = $ErrorNumber; } }

当我调用Web服务方法(返回soap错误)时,我在try catch子句中这样做:

function add_new_sponsor() { // ... code try { $new_sponsor = new PostNewSponsor( $accessKey, $type, $initialRecordStatus, $monthlyAmount, $categoryCode, $titleCode, $firstName, $lastName, $organisationName, $street, $houseNumber, $apartment, $extraAddressLine, $postCode, $town, $countryISOCode, $privatePhone, $mobilePhone, $workPhone, $eMailAddress, $sourceCode, $paymentFrequencyCode, $paymentTypeCode, $numberOfChildren, $scGender, $continentCode, $scCountryISOCode, $olderChildFlag, $personalID, $AddressTypeCode, $extRelNo, $comments, $iPAddress); $result = plan_utils_post_sponsor($new_sponsor); } catch (Exception $e) { echo 'Exception->detail var_dump: <br/>'; var_dump($e->detail); echo '<br/></br>'; $myplan_error = cast('MyPlanWSError', $e->detail); echo 'MyPlanWSError var_dump <br/>'; var_dump($myplan_error); echo '<br/><br/>'; echo 'MyPlanWSError->Details var_dump <br/>'; var_dump($myplan_error->Details); echo '<br/><br/>'; } } function cast($destination, $sourceObject) { if (is_string($destination)) { $destination = new $destination(); } $sourceReflection = new ReflectionObject($sourceObject); $destinationReflection = new ReflectionObject($destination); $sourceProperties = $sourceReflection->getProperties(); foreach ($sourceProperties as $sourceProperty) { $sourceProperty->setAccessible(true); $name = $sourceProperty->getName(); $value = $sourceProperty->getValue($sourceObject); if ($destinationReflection->hasProperty($name)) { $propDest = $destinationReflection->getProperty($name); $propDest->setAccessible(true); $propDest->setValue($destination,$value); } else { $destination->$name = $value; } } return $destination; }

这个强制转换方法取自http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class。

所以我期望从var_dump($myplan_error->Details)是"2 duplicate(s) detected" ,而是我得到NULL :(

以下是catch子句的全部输出:

Exception->detail var_dump: object(stdClass)#4 (1) { ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } MyPlanWSError var_dump object(MyPlanWSError)#3 (5) { ["BadParameters"]=> NULL ["Details"]=> NULL ["Duplicates"]=> NULL ["ErrorNumber"]=> NULL ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } MyPlanWSError->Details var_dump NULL

所以看起来问题在于我无法成功将$e>detail转换为MyPlanWSError类。

有任何想法吗? :)

I am having problem converting a php Exception to a generic class.

I am calling a web service method and when it fails it returns a soap fault with information in the "detail tag". This is how the result looks like if I call the web service method with Soap UI (http://soapui.org) :

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <s:Fault> <faultcode>s:Client</faultcode> <faultstring xml:lang="sv-SE">Error Posting New Sponsor Full to Middleware</faultstring> <detail> <MyPlanWSError xmlns="http://schemas.datacontract.org/2004/07/MyPlanPOA" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <BadParameters i:nil="true"/> <Details>2 duplicate(s) detected</Details> <Duplicates> <DuplicateInfo> <DuplicatedExtRelNo>0</DuplicatedExtRelNo> <POAStatus>New</POAStatus> <Source>NewExtRels</Source> <SourceRecordID>194</SourceRecordID> <Type>eMail</Type> </DuplicateInfo> <DuplicateInfo> <DuplicatedExtRelNo>0</DuplicatedExtRelNo> <POAStatus>New</POAStatus> <Source>NewExtRels</Source> <SourceRecordID>194</SourceRecordID> <Type>Address</Type> </DuplicateInfo> </Duplicates> <ErrorNumber>7</ErrorNumber> </MyPlanWSError> </detail> </s:Fault> </s:Body> </s:Envelope>

I want to get the MyPlanWSError content that is in the "detail" tag. I want to convert that to a php class.

I have used the nice tool wsdl2php (http://www.urdalen.no/wsdl2php) to generate helper classes based on a wsdl file, so that I don't have to write all code myself :) The tool generated the MyPlanWSError which looks like this:

class MyPlanWSError { public $BadParameters; public $Details; public $Duplicates; public $ErrorNumber; public function __construct($BadParameters, $Details, $Duplicates, $ErrorNumber) { $this->BadParameters = $BadParameters; $this->Details = $Details; $this->Duplicates = $Duplicates; $this->ErrorNumber = $ErrorNumber; } }

When I call the web service method (that returns the soap fault), I do that in a try catch clause:

function add_new_sponsor() { // ... code try { $new_sponsor = new PostNewSponsor( $accessKey, $type, $initialRecordStatus, $monthlyAmount, $categoryCode, $titleCode, $firstName, $lastName, $organisationName, $street, $houseNumber, $apartment, $extraAddressLine, $postCode, $town, $countryISOCode, $privatePhone, $mobilePhone, $workPhone, $eMailAddress, $sourceCode, $paymentFrequencyCode, $paymentTypeCode, $numberOfChildren, $scGender, $continentCode, $scCountryISOCode, $olderChildFlag, $personalID, $AddressTypeCode, $extRelNo, $comments, $iPAddress); $result = plan_utils_post_sponsor($new_sponsor); } catch (Exception $e) { echo 'Exception->detail var_dump: <br/>'; var_dump($e->detail); echo '<br/></br>'; $myplan_error = cast('MyPlanWSError', $e->detail); echo 'MyPlanWSError var_dump <br/>'; var_dump($myplan_error); echo '<br/><br/>'; echo 'MyPlanWSError->Details var_dump <br/>'; var_dump($myplan_error->Details); echo '<br/><br/>'; } } function cast($destination, $sourceObject) { if (is_string($destination)) { $destination = new $destination(); } $sourceReflection = new ReflectionObject($sourceObject); $destinationReflection = new ReflectionObject($destination); $sourceProperties = $sourceReflection->getProperties(); foreach ($sourceProperties as $sourceProperty) { $sourceProperty->setAccessible(true); $name = $sourceProperty->getName(); $value = $sourceProperty->getValue($sourceObject); if ($destinationReflection->hasProperty($name)) { $propDest = $destinationReflection->getProperty($name); $propDest->setAccessible(true); $propDest->setValue($destination,$value); } else { $destination->$name = $value; } } return $destination; }

The cast method was taken from //http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class.

So what I expect the output to be from the var_dump($myplan_error->Details) is "2 duplicate(s) detected" but instead I get NULL :(

Here is the whole output from the catch clause:

Exception->detail var_dump: object(stdClass)#4 (1) { ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } MyPlanWSError var_dump object(MyPlanWSError)#3 (5) { ["BadParameters"]=> NULL ["Details"]=> NULL ["Duplicates"]=> NULL ["ErrorNumber"]=> NULL ["MyPlanWSError"]=> object(stdClass)#5 (4) { ["BadParameters"]=> NULL ["Details"]=> string(23) "2 duplicate(s) detected" ["Duplicates"]=> object(stdClass)#6 (1) { ["DuplicateInfo"]=> array(2) { [0]=> object(stdClass)#7 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(5) "eMail" } [1]=> object(stdClass)#8 (5) { ["DuplicatedExtRelNo"]=> string(1) "0" ["POAStatus"]=> string(3) "New" ["Source"]=> string(10) "NewExtRels" ["SourceRecordID"]=> string(3) "194" ["Type"]=> string(7) "Address" } } } ["ErrorNumber"]=> string(1) "7" } } MyPlanWSError->Details var_dump NULL

So it seems the problem is that I can't succeed converting the $e>detail to a MyPlanWSError class.

Any ideas? :)

最满意答案

看起来你想要转换细节对象,而不是MyPlanWSError对象。 因此,它的属性不匹配,并且结果对象具有全部空值。

试试这个,它应该工作得很好:

$myplan_error = cast('MyPlanWSError', $e->detail->MyPlanWSError);

Looks like you're trying to cast the detail object, not the MyPlanWSError object. Thus, its properties aren't matching up, and the resulting object has all null values.

Try this instead, and it should work fine:

$myplan_error = cast('MyPlanWSError', $e->detail->MyPlanWSError);

更多推荐

MyPlanWSError,var_dump,电脑培训,计算机培训,IT培训"/> <meta name="descri

本文发布于:2023-08-05 12:22:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1432320.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:转换为   故障   异常   soap   php

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!