简体   繁体   English

网络服务Ksoap2复杂对象

[英]web-service Ksoap2 Complex objects

I can´t solve this problem and go on... I have a big problem in my app. 我无法解决此问题,然后继续...我的应用程序中有一个大问题。 Any help would be really appreciated, I will try to put all the code. 任何帮助将不胜感激,我将尝试放置所有代码。

Thank you very much! 非常感谢你!

The main error is this one: 主要错误是此错误:

[ERROR] Exception occurred while trying to invoke service method almacenaCoordenadas
org.apache.axis2.AxisFault: Unknow type {http://www.w3.org/2001/XMLSchema}Coordenada

The complex object that I want to send is this one: 我要发送的复杂对象是:

import java.util.Hashtable;

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



public class Coordenada implements KvmSerializable {


private long longitud;
private long latitud;

public Coordenada(long lat, long lon) {

    longitud = lon;
    latitud = lat;

}

public void setLongitud(long lon) {
    longitud = lon;
}

public void setLatitud(long lat) {
    latitud = lat;
}

public long getLongitud() {
    return longitud;
}

public long getLatitud() {
    return latitud;
}

@Override
public Object getProperty(int arg0) {

    switch (arg0) {
    case 0:
        return latitud;
    case 1:
        return longitud;

    }

    return null;
}

@Override
public int getPropertyCount() {

    return 2;
}



@Override
public void setProperty(int ind, Object val) {

    switch(ind){
    case 0:
        latitud = Long.parseLong(val.toString());
        break;
    case 1:
        longitud = Long.parseLong(val.toString());
        break;

    default:
        break;
    }

}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {

    switch(arg0){
    case 0:
        arg2.type = PropertyInfo.LONG_CLASS;
        arg2.name = "latitud";
        break;
    case 1:
        arg2.type = PropertyInfo.LONG_CLASS;
        arg2.name = "longitud";
        break;

    default:break;
}

}

}

I send it by calling this method: 我通过调用此方法发送它:

private String almacenaCoordenadas() {

        accionSoap = "http://ws.webapp.org/almacenaCoordenadas";
        metodo = "almacenaCoordenadas";
        String retorno="";

        try {

            // Modelo el request
            SoapObject request = new SoapObject(namespace, metodo);

            PropertyInfo primerParametro = new PropertyInfo();
            PropertyInfo segundoParametro = new PropertyInfo();
            //PropertyInfo tercerParametro = new PropertyInfo();
            primerParametro.setName("id");
            primerParametro.setValue(user);
            segundoParametro.setName("coord");
            segundoParametro.setValue(coordenada);
            request.addProperty(primerParametro);
            request.addProperty(segundoParametro);

            /*
            segundoParametro.setName("lo");
            segundoParametro.setValue(longitud);
            tercerParametro.setName("lat");
            tercerParametro.setValue(latitud);
            request.addProperty(primerParametro);
            request.addProperty(segundoParametro);
            request.addProperty(tercerParametro);*/


            // Modelo el Sobre
            SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            // si esta hecho o no en puntoNet
            sobre.dotNet = false;
            sobre.setOutputSoapObject(request);

                    sobre.AddMapping(namespace, "Coordenada", new Coordenada().getClass();

            // Modelo el transporte
            HttpTransportSE transporte = new HttpTransportSE(url);

            // Llamada
            System.out.println(sobre);
            transporte.call(accionSoap, sobre);

            // Resultado
            SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse();

            retorno = resultado.toString();

            if (retorno!=null)
                Log.i("Resultado", "Envio correcto de coordenada");

        } catch (Exception e) {
            String s="";
            s+="ERROR - Envio de coordenada\n";
            s+=e.toString();
            Log.e("MainActivity",s);

        }

        return retorno;
    }

from this one: (is an AsyncTask) 从这个:(是一个AsyncTask)

@Override
    protected String doInBackground(String... params) {

        almacenaCoordenadas();
        return null;
    }

And the method in the webservice is this one: Web服务中的方法是这样的:

public String almacenaCoordenadas(String id, Coordenada coord){
        String resultado="Coordenadas recibidas correctamente";

        System.out.println(id+" esta en las coordenadas:");
        if(coord!=null){
            System.out.println("Llega coordenada");
        }

        return resultado;
    }

The error is this one: 错误是这个:

[ERROR] Exception occurred while trying to invoke service method almacenaCoordenadas
org.apache.axis2.AxisFault: Unknow type {http://www.w3.org/2001/XMLSchema}Coordenada
    at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:340)
    at org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:818)
    at org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:737)
    at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:646)
    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:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    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:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

It looks like the webservice cant't process the object Coordenada.. 看来网络服务无法处理对象Coordenada。

Any help would be appreciated. 任何帮助,将不胜感激。 Thank you very much!! 非常感谢你!!

Unknow type {http://www.w3.org/2001/XMLSchema}Coordenada

This part seems to be the cause of the problem. 这部分似乎是问题的原因。 You need to change the name value to what your server waits(that is not Coordenada as we see from the error). 您需要将name值更改为服务器等待的name (这不是我们从错误中看到的Coordenada)。

sobre.AddMapping(namespace, "Coordenada", new Coordenada().getClass();

addMapping(java.lang.String namespace, java.lang.String name,java.lang.Class clazz) addMapping(java.lang.String命名空间,java.lang.String名称,java.lang.Class clazz)
Defines a direct mapping from a namespace and name to a java class (and vice versa) 定义从名称空间和名称到Java类的直接映射(反之亦然)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM