Android アプリケーションを開発し、Web サービスを呼び出してクラス オブジェクトをパラメーターとしてメソッドに渡そうとしました。そのクラスには Partner というリスト フィールドがあり、このフィールドが Web サービスに送信されたことはないと思います。
これは私の顧客クラスです:
package com.testcustomer22;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class Customer extends MainActivity implements KvmSerializable
{
private static final long serialVersionUID = 1L;
public String Code;
public String Name;
public String VATNo;
public String PriceList;
public List<Partner> Partner = new ArrayList<Partner>();
public Customer(){}
public Customer(String cCode, String cName, String cVATNo, String cPriceList, List<Partner> cPartner) {
Code = cCode;
Name = cName;
VATNo = cVATNo;
PriceList = cPriceList;
Partner = cPartner;
}
public Object getProperty(int index) {
Object res = null;
switch(index)
{
case 0:
res = this.Code;
break;
case 1:
res = this.Name;
break;
case 2:
res = this.VATNo;
break;
case 3:
res = this.PriceList;
break;
case 4:
res = this.Partner;
break;
}
return res;
}
public int getPropertyCount() {
return 4;
}
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch (index)
{
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "Code";
break;
case 1:
info.type = PropertyInfo.STRING_CLASS;
info.name = "Name";
break;
case 2:
info.type = PropertyInfo.STRING_CLASS;
info.name = "VATNo";
break;
case 3:
info.type = PropertyInfo.STRING_CLASS;
info.name = "PriceList";
break;
case 4:
info.type = PropertyInfo.VECTOR_CLASS;
info.name = "Partner";
break;
}
}
@SuppressWarnings("unchecked")
public void setProperty(int index, Object value) {
switch(index)
{
case 0:
this.Code = value.toString();
break;
case 1:
this.Name = value.toString();
break;
case 2:
this.VATNo = value.toString();
break;
case 3:
this.PriceList = value.toString();
break;
case 4:
this.Partner = (List<com.testcustomer22.Partner>) value;
break;
default:
break;
}
}
}
これは、Web サービスを呼び出す MainActivity です。
package com.testcustomer22;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity
{
private static String SOAP_ACTION1 = "http://tempuri.org/Service/GetCustomer";
private static String NAMESPACE = "http://tempuri.org/";
private static String METHOD_NAME1 = "GetCustomer";
private static String URL = "http://xxxxxxxx:8000/Service?wsdl";
TextView TextView01;
EditText editText2,editText1;
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
TextView01 = (TextView)findViewById(R.id.TextView01);
editText2 = (EditText)findViewById(R.id.editText2);
editText1 = (EditText)findViewById(R.id.editText1);
Customer C = new Customer();
C.setProperty(0,"0000000000000000");
//Initialize soap request + add parameters
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);
//Declare the version of the SOAP request
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
//Pass value for userName variable of the web service
PropertyInfo pi =new PropertyInfo();
pi.setName("customer"); //Define the variable name
pi.setValue(C); //set value for userName variable
pi.setType(C.getClass()); //Define the type of the variable
request.addProperty(pi); //Pass properties to the variable
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
envelope.dotNet = true;
envelope.addMapping(NAMESPACE, "customer", new Customer().getClass());
try{
editText2.setText("before call websrv");
//this is the actual part that will call the webservice
androidHttpTransport.call(SOAP_ACTION1, envelope);
//Get the SoapResult from the envelope body.
SoapObject response = (SoapObject) envelope.bodyIn;
Log.i("REQUEST--->", androidHttpTransport.requestDump);
Log.i("RESPONSE--->", androidHttpTransport.responseDump);
Log.i("Response.toString()---------->", response.toString());
}catch (Exception e)
{
e.printStackTrace();
}
}
});
}
}
「Log.i("REQUEST--->"...」という行を追加して、サービスに送信される要求を出力します。問題は、「getPropertyCount()」に「return 5」を書き込むとCustomer クラスのメソッドを実行し、メイン アクティビティを実行しようとすると、例外がスローされます。「getPropertyCount()」に「return4」を書き込むと、次のように返されます。
I/REQUEST---------------------->(1156): <v:Envelope
xmlns:i="http://www.w3.org/1999/XMLSchema-instance"
xmlns:d="http://www.w3.org/1999/XMLSchema"
xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header /><v:Body><GetCustomer
xmlns="http://tempuri.org/" id="o0" c:root="1"><customer i:type="d:anyType"><Code
i:type="d:string">0000000000000000</Code><Name i:null="true" /><VATNo i:null="true" />
<PriceList i:null="true" /></customer></GetCustomer></v:Body></v:Envelope>
パートナー以外のすべてのフィールドが表示されます。
リストフィールドを正しく渡す方法があれば教えてください。
どうもありがとう。