複雑なオブジェクトを次のようにリクエストに送信しました。 これ で、レスポンスから複雑なオブジェクトを取得したいと思います。以下は、SOAP 1.1 応答のサンプルです。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CommitReceiptionAgentResponse xmlns="http://mywebService.ir/">
<CommitReceiptionAgentResult Exc="string">
<Errors>
<string>string</string>
<string>string</string>
</Errors>
<CST>dateTime</CST>
</CommitReceiptionAgentResult>
</CommitReceiptionAgentResponse>
</soap:Body>
</soap:Envelope>
CommitReceiptionAgentResponse クラスを作成しました:
public class CommitReceiptionAgentResponse implements KvmSerializable {
@Element(name = "CommitReceiptionAgentResult")
CommitReceiptionAgentResult commitReceiptionAgentResult;
.
.
.
}
CommitReceiptionAgentResult クラスも作成しました。
public class CommitReceiptionAgentResult extends Vector<String> implements KvmSerializable {
@ElementList(name = "Errors")
public Errors errors;
@Attribute(name = "Exc", required = false)
public String InternalServiceException;
@Element(name = "CST", required = false)
public Date CommitStartTime;
.
.
.
}
blew として定義された CommitReceiptionAgentResult クラスの getProperty() メソッド:
@Override
public Object getProperty(int arg0) {
switch (arg0) {
case 0:
Errors errorList = getErrors();
SoapObject erlistObject = new SoapObject(
ServiceUtil.WSDL_TARGET_NAMESPACE, "errorList");
try{
if (errorList.size() > 0) {
for (String error : errorList) {
SoapObject erObject = new SoapObject(
ServiceUtil.WSDL_TARGET_NAMESPACE, "Errors");
PropertyInfo info = new PropertyInfo();
errorList.getPropertyInfo(0, null, info);
erObject.addProperty(info.name,
errorList.getProperty(0));
erlistObject.addSoapObject(erObject);
}
}
}catch (Exception e) {
}
return erlistObject;
case 1:
return getInternalServiceException();
case 2:
return getCommitStartTime();
}
return null;
}
@Element(name = "CST", required = false)
public Date CommitStartTime;
}
そして、次のような Errors クラスを作成します。
public class Errors extends Vector<String> implements KvmSerializable{
@Override
public Object getProperty(int arg0) {
return this.get(arg0);
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
arg2.name = "string";
arg2.type = PropertyInfo.STRING_CLASS;
}
@Override
public void setProperty(int arg0, Object arg1) {
this.add(arg1.toString());
}
}
このリンク と これに従ってsoapオブジェクトとエンベロープを定義する と 、envelope.getResponse()はnullになります:
final SoapObject response1 = new SoapObject(WSDL_TARGET_NAMESPACE,
"CommitReceiptionAgentResponse");
response1.addProperty("CommitReceiptionAgentResult",
new CommitReceiptionAgentResult());
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.setOutputSoapObject(response1);
envelope.addMapping(WSDL_TARGET_NAMESPACE,
"CommitReceiptionAgentResponse",
new CommitReceiptionAgentResponse().getClass());
envelope.addMapping(WSDL_TARGET_NAMESPACE,
"CommitReceiptionAgentResult",
new CommitReceiptionAgentResult().getClass());
envelope.addMapping(WSDL_TARGET_NAMESPACE, "Errors",
new Errors().getClass());
HttpTransportSE httpTransport1 = new HttpTransportSE(SOAP_ADDRESS);
try {
httpTransport1.debug = true;
httpTransport1.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
httpTransport1.call(SOAP_ACTION, envelope); // in/out
SoapObject response = (SoapObject) soapEnvelope.getResponse();
}catch(exception){}
いろいろ検索しましたが、問題が見つかりませんでした。クラスの実装を知りたいのですが、addMappings は「true」ですか?! それが間違っている場合、正しい答えは何ですか。誰かが私を助けてくれれば幸いです。前もって感謝します
私の英語ですみません。