1

ローカルのTomcatサーバーとクライアントのAndroidにWebサービスがあります。ksoap2を介してクライアントからWebサービスにカスタムオブジェクトの配列を送信する必要があります。これは、クライアントで定義されたオブジェクトのコードです。

    import java.io.Serializable;
import java.util.Hashtable;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;


public class Istante implements KvmSerializable, Serializable
{

private static final long serialVersionUID = 1L;

public float XCoord;
public float YCoord;
public float Pressure;
public float gap;
int action;
int idCampione;
int idAnagrafica;


public Istante() {

}

public Istante(float xCoord, float yCoord, float pressure, float Gap, int Action, int IdCampione, int IdAnagrafica) {

    this.XCoord = xCoord;
    this.YCoord = yCoord;
    this.Pressure = pressure;
    this.gap = Gap;
    this.action = Action;
    this.idCampione = IdCampione;
    this.idAnagrafica = IdAnagrafica;
}
@Override
public Object getProperty(int arg0) {

    switch (arg0) {
    case 0:
        return XCoord;
    case 1: 
        return YCoord;
    case 2:
        return Pressure;
    case 3:
        return gap;
    case 4: 
        return action;
    case 5:
        return idCampione;
    case 6:
        return idAnagrafica;
    default:
        return null;
    }
}

@Override
public int getPropertyCount() {

    return 7;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
    switch (arg0) {
    case 0:
        arg2.name = "XCoord";
        arg2.type = Float.class;
        break;
    case 1: 
        arg2.name = "YCoord";
        arg2.type = Float.class;
        break;
    case 2:
        arg2.name = "Pressure";
        arg2.type = Float.class;
        break;
    case 3:
        arg2.name = "gap";
        arg2.type = Float.class;
        break;
    case 4: 
        arg2.name = "action";
        arg2.type = PropertyInfo.INTEGER_CLASS;
        break;
    case 5:
        arg2.name = "idCampione";
        arg2.type = PropertyInfo.INTEGER_CLASS;
        break;
    case 6:
        arg2.name = "idanagrafica";
        arg2.type = PropertyInfo.INTEGER_CLASS;
        break;
    default:
        break;
    }

}

@Override
public void setProperty(int arg0, Object arg1) {
    switch (arg0) {
    case 0:
        XCoord = Float.parseFloat(arg1.toString());
        break;
    case 1: 
        YCoord = Float.parseFloat(arg1.toString());
        break;
    case 2:
        Pressure = Float.parseFloat(arg1.toString());
        break;
    case 3:
        gap = Float.parseFloat(arg1.toString());
        break;
    case 4: 
        action = Integer.parseInt(arg1.toString());
        break;
    case 5:
        idCampione = Integer.parseInt(arg1.toString());
        break;
    case 6:
        idAnagrafica = Integer.parseInt(arg1.toString());
        break;
    default:
        break;
    }

}
}


    import java.util.Hashtable;
import java.util.Vector;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class ListaIstanti extends Vector<Istante> implements KvmSerializable {

        private static final long serialVersionUID = 1L;  // you can let the IDE generate this

    @Override
    public Object getProperty(int index) {
    return this.get(index);
    }

    @Override
    public int getPropertyCount() {
    return this.size();
    }

    @Override
    public void setProperty(int index, Object value) {
    this.add((Istante) value);
    }

    @Override
    public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {
    info.name = "Istante";
    info.type = Istante.class;
    }


}


public class Campione implements KvmSerializable {

private static final long serialVersionUID = 1L;

public ListaIstanti istanti;
//public int size;

public Campione() {
}


public Campione(ListaIstanti listaIstanti) {
    //size = listaIstanti.length;
    //istanti = new Istante[size];
    istanti = new ListaIstanti();
    istanti = listaIstanti;
}

@Override
public Object getProperty(int arg0) {
    switch (arg0) {
    case 0:
        return istanti;
    default:
        return null;
    }
}

@Override
public int getPropertyCount() {
    return 1;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
    switch (arg0) {
    case 0:
        arg2.name = "campione";
        arg2.type = ListaIstanti.class;
        break;
    default:
        break;
    }

}

@Override
public void setProperty(int arg0, Object arg1) {
    switch (arg0) {
    case 0:
        istanti = (ListaIstanti) arg1;
        break;
    default:
        break;
    }

}

}

そして、これはクライアントのコードの一部です:

    ...
METHOD_NAME = "setCampioni";
ListaIstanti lista = new ListaIstanti();
        for (int q=0; q<istanti.size(); q++){
            //camp[q] = istanti.get(q);     
            lista.add(istanti.get(q));
        } 
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
try {
 PropertyInfo pi = new PropertyInfo();
            pi.setName("Campione");
            pi.setValue(campione);
            pi.setType(Campione.class);
            request.addProperty(pi);
                    SoapEnvelope.VER11);

            envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        envelope.addMapping(NAMESPACE2, "Istante", new Istante().getClass());
        envelope.addMapping(NAMESPACE2, "Campione", new Campione().getClass());
        envelope.addMapping(NAMESPACE2, "ListaIstanti", new ListaIstanti().getClass());
        Marshal floatMarshal = new MarshalFloat();
        floatMarshal.register(envelope);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;
        } catch (Exception E) {
        E.printStackTrace();
        }
        ...

したがって、これらはサーバーサイドの同じオブジェクトのクラスです。

import java.io.Serializable;


public class Istante implements Serializable {

private static final long serialVersionUID = 1L;

public float XCoord;
public float YCoord;
public float Pressure;
public float gap;
int action;
int idCampione;
int idAnagrafica;

public Istante() {
}

public Istante(float xCoord, float yCoord, float pressure, float Gap, int Action, int IdCampione, int IdAnagrafica) {

    this.XCoord = xCoord;
    this.YCoord = yCoord;
    this.Pressure = pressure;
    this.gap = Gap;
    this.action = Action;
    this.idCampione = IdCampione;
    this.idAnagrafica = IdAnagrafica;
}

public void setXCoord(float XCoord) {
    this.XCoord = XCoord;
}

public void setYCoord(float YCoord) {
    this.YCoord = YCoord;
}

public void setPressure(float Pressure) {
    this.Pressure = Pressure;
}

public void setGap(float gap) {
    this.gap = gap;
}

public void setAction(int action) {
    this.action = action;
}

public void setIdCampione(int idCampione) {
    this.idCampione = idCampione;
}

public void setIdAnagrafica(int idAnagrafica) {
    this.idAnagrafica = idAnagrafica;
}

public float getXCoord() {
    return XCoord;
}

public float getYCoord() {
    return YCoord;
}

public float getPressure() {
    return Pressure;
}

public float getGap() {
    return gap;
}

public int getAction() {
    return action;
}

public int getIdCampione() {
    return idCampione;
}

public int getIdAnagrafica() {
    return idAnagrafica;
}

}

import java.io.Serializable;

import java.util.Vector;


public class ListaIstanti extends Vector<Istante> implements Serializable {

private static final long serialVersionUID = 1L;  // you can let the IDE generate this




}


import java.io.Serializable;

import com.biosign.vo.ListaIstanti;


public class Campione implements Serializable {

    private static final long serialVersionUID = 1L;

    public ListaIstanti istanti = new ListaIstanti();

    public Campione() {
    }

public Istante getIstante(int index) {
return this.get(index);
}

public int getSize() {
return this.size();
}


public void setIstante(Istante value) {
this.add((Istante) value);
}
}



public void setCampione(ListaIstanti listaIstanti) {

    istanti = listaIstanti;
}

public ListaIstanti getCampione() {
    return istanti;
}

public int size() {
    return istanti.size();
}

public Istante get(int i) {
    return istanti.get(i);
}

}

これはWebサービスクラスのメソッドです。

public Boolean setCampioni(Campione campioni){


          try {
            stmt = (Statement) con.createStatement();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          ListaIstanti lista = new ListaIstanti();
          lista = campioni.getCampione();
          Istante ist = new Istante();
          ist = lista.get(1);
          System.out.println("eccoci" + ist.getXCoord());
          }

したがって、配列の送信を要求しようとすると、クライアントはオブジェクトを正常にシリアル化しますが、サーバーサイドでは次のエラーが発生します。

java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:630)
at org.apache.axis2.rpc.receivers.RPCUtil.processRequest(RPCUtil.java:153)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:206)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

およびLogCatの場合:

W/System.err(1306): SoapFault - faultcode: 'soapenv:Server' faultstring: '1' faultactor: 'null' detail: org.kxml2.kdom.Node@41021438

助けてください:私のWebサービスがオブジェクトを逆シリアル化できないのはなぜですか?

4

0 に答える 0