Android Ksoap传递对象作为参数错误

时间:2012-07-01 17:18:57

标签: android android-ksoap2

我通过发送Object和请求来与Web服务进行通信。

这是对Web服务的请求格式。

<?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>
<UpdateLocation xmlns="http://tempuri.org/">
<location>
<Id>int</Id>
<TabletId>int</TabletId>
<SpeedVisibility>boolean</SpeedVisibility>
<BeltVisibility>boolean</BeltVisibility>
<LightVisibility>boolean</LightVisibility>
<ProjectorVisibility>boolean</ProjectorVisibility>
<DefStart>int</DefStart>
<DefEnd>int</DefEnd>
<DefPickerCount>int</DefPickerCount>
<DefSlotCount>int</DefSlotCount>
<ServerIP>string</ServerIP>
<WebURL>string</WebURL>
</location>
</UpdateLocation>
</soap:Body>
</soap:Envelope>

这是我提出请求的java代码。

private void updateSettingsOnServer() {
SoapObject request = new SoapObject(NAMESPACE, METHOD_UPDATE_SETTINGS);

Location serverObject = new Location(currentLocation.databaseId, currentLocation.tabletId, currentLocation.isSpeedVisible, currentLocation.isBeltVisible, currentLocation.isLightVisible, currentLocation.isProjectorVisible, currentLocation.slotStarting, currentLocation.slotEnding, prefPickerCount, prefSlotCount, prefServerIPString, prefWebURL);


 PropertyInfo pi = new PropertyInfo();
    pi.setName("serverObject");
    pi.setValue(serverObject);
    pi.setType(serverObject.getClass());
    request.addProperty(pi);




SoapSerializationEnvelope envelope = 
    new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true;
envelope.setOutputSoapObject(request);



envelope.addMapping(NAMESPACE,"Location",new Location().getClass());


HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);




try {
    androidHttpTransport.call(SOAP_ACTION_UPDATE_SETTINGS, envelope);




    SoapObject result=(SoapObject)envelope.getResponse(); //To get the data.
    tempText.setText("Received :" + result.toString());

}
catch(Exception e)
{

    tempText.setText("Error");
    //Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
    e.printStackTrace();
}

}

我按以下方式制作了自定义类KVMSerializable。

class Location implements KvmSerializable
{
public Location(int id, int tabletid, boolean speed, boolean belt, boolean light, boolean projector, int start, int end, int picker, int slot, String server, String web)
{
    databaseId =id;
    tabletId = tabletid;
    isSpeedVisible = speed;
    isBeltVisible = belt;
    isLightVisible = light;
    isProjectorVisible = projector;
    slotStarting = start;
    slotEnding = end;
    pickerCounting = picker;
    slotCounting = slot;
    serverUrlLink = server;
    webUrlLink = web;


}

public Location() {
    // TODO Auto-generated constructor stub
}

boolean isSpeedVisible, isLightVisible, isBeltVisible, isProjectorVisible;
int slotStarting, slotEnding , pickerCounting, slotCounting;
int databaseId, tabletId;
String serverUrlLink, webUrlLink;


public Object getProperty(int arg0) {
    // TODO Auto-generated method stub

     switch(arg0)
        {
        case 0:
            return databaseId;
        case 1:
            return tabletId;
        case 2:
            return isSpeedVisible;
        case 3:
            return isBeltVisible;
        case 4:
            return isLightVisible;
        case 5:
            return isProjectorVisible;
        case 6:
            return slotStarting;
        case 7:
            return slotEnding;
        case 8:
            return pickerCounting;
        case 9:
            return slotCounting;
        case 11:
            return serverUrlLink;
        case 12:
            return webUrlLink;

        }

     return null;
}


public int getPropertyCount() {
    // TODO Auto-generated method stub
    return 12;
}



public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) {
    // TODO Auto-generated method stub

    switch(arg0)
    {
    case 0:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "databaseId";
        break;
    case 1:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "tabletId";
        break;
    case 2:
        info.type = PropertyInfo.BOOLEAN_CLASS;
        info.name = "isSpeedVisible";
        break;
    case 3:
        info.type = PropertyInfo.BOOLEAN_CLASS;
        info.name = "isBeltVisible";
        break;
    case 4:
        info.type = PropertyInfo.BOOLEAN_CLASS;
        info.name = "isLightVisible";
        break;
    case 5:
        info.type = PropertyInfo.BOOLEAN_CLASS;
        info.name = "isProjectorVisible";
        break;
    case 6:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "slotStarting";
        break;
    case 7:
        info.type = PropertyInfo.STRING_CLASS;
        info.name = "slotEnding";
        break;
    case 8:
        info.type = PropertyInfo.STRING_CLASS;
        info.name = "pickerCounting";
        break;
    case 9:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "slotCounting";
        break;
    case 11:
        info.type = PropertyInfo.STRING_CLASS;
        info.name = "serverUrlLink";
        break;
    case 12:
        info.type = PropertyInfo.STRING_CLASS;
        info.name = "webUrlLink";
        break;

    default:break;
    }



}
public void setProperty(int index, Object value) {
    // TODO Auto-generated method stub

    switch(index)
    {
    case 0:
        databaseId = Integer.parseInt(value.toString());
        break;
    case 1:
        tabletId = Integer.parseInt(value.toString());
        break;
    case 2:
        isSpeedVisible = Boolean.parseBoolean(value.toString());
        break;
    case 3:
        isBeltVisible = Boolean.parseBoolean(value.toString());
        break;
    case 4:
        isLightVisible = Boolean.parseBoolean(value.toString());
        break;
    case 5:
        isProjectorVisible = Boolean.parseBoolean(value.toString());
        break;
    case 6:
        slotStarting = Integer.parseInt(value.toString());
        break;
    case 7:
        slotEnding = Integer.parseInt(value.toString());
        break;
    case 8:
        pickerCounting = Integer.parseInt(value.toString());
        break;
    case 9:
        slotCounting = Integer.parseInt(value.toString());
        break;
    case 10:
        serverUrlLink = (value.toString());
        break;
    case 11:
        webUrlLink = (value.toString());
        break;


    default:
        break;
    }

}
}

但是,不幸的是,它没有用。

我收到错误。我环顾四周,但仍然无法找到解决方案。

SoapFault - faultcode: 'soap:Server' faultstring: 'Server was unable to process request. ---> Object reference not set to an instance of an object.' faultactor: 'null' detail

请帮助/建议我如何解决错误。

0 个答案:

没有答案