Error Parsing XML response attributes with ksoap2 returns ClassCastException

时间:2021-12-11 15:51:19

I'm trying to figure out how to cast the response of the consume of a webservice, when casting the response envelope.bodyIn to my extended class object "BiometricConfigurationResponse" i'm getting this error:

我正在试图弄清楚如何投射web服务消费的响应,当将响应envelope.bodyIn转换为我的扩展类对象“BiometricConfigurationResponse”时,我收到此错误:

java.lang.ClassCastException: org.ksoap2.serialization.SoapObject cannot be cast to org.tempuri.BiometricConfigurationResponse

java.lang.ClassCastException:org.ksoap2.serialization.SoapObject无法强制转换为org.tempuri.BiometricConfigurationResponse

The service is responding well and if i not cast it i get the dump right. Any ideas?

该服务响应良好,如果我不投,我得到转储权。有任何想法吗?

This is what i'm doing:

这就是我正在做的事情:

BiometricConfigurationResponse response= null;
SoapObject obj = new SoapObject (wsNameSpace, methodName);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;
envelope.dotNet = true;
envelope.setOutputSoapObject(obj);
envelope.addMapping(wsNameSpace, "BiometricConfigurationResponse", new BiometricConfigurationResponse().getClass());

HttpTransportSE androidHttpTransport = new HttpTransportSE(wsURL);
androidHttpTransport.debug = true;

 try {
         String soapAction=wsNameSpace + methodName;
         androidHttpTransport.call(soapAction, envelope);
        System.out.println(androidHttpTransport.requestDump);

        response =  (BiometricConfigurationResponse)envelope.bodyIn;


    } 
    catch (Exception e) {

        e.printStackTrace();
    }

And this is my custom class

这是我的自定义课程

package org.tempuri;

import java.util.Hashtable;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;

public final class BiometricConfigurationResponse extends SoapObject {
    private int coderAlgorithm;

private int templateFormat;

private boolean juvenileMode;

private int qualityThreshold;

private boolean retryAcquisition;

private boolean acceptBadQualityEnrollment;

private boolean showQualityBar;

private boolean showQualityThreshold;

private int timeout;

private int timeoutQualityCoder;

private int enrollSecurityLevel;

private boolean securityLevelCompatibility;

private boolean liveImage;

private java.lang.String setCulture;

private int authenticationScore;

public BiometricConfigurationResponse() {
    super("", "");
}
public void setCoderAlgorithm(int coderAlgorithm) {
    this.coderAlgorithm = coderAlgorithm;
}

public int getCoderAlgorithm(int coderAlgorithm) {
    return this.coderAlgorithm;
}

public void setTemplateFormat(int templateFormat) {
    this.templateFormat = templateFormat;
}

public int getTemplateFormat(int templateFormat) {
    return this.templateFormat;
}

public void setJuvenileMode(boolean juvenileMode) {
    this.juvenileMode = juvenileMode;
}

public boolean getJuvenileMode(boolean juvenileMode) {
    return this.juvenileMode;
}

public void setQualityThreshold(int qualityThreshold) {
    this.qualityThreshold = qualityThreshold;
}

public int getQualityThreshold(int qualityThreshold) {
    return this.qualityThreshold;
}

public void setRetryAcquisition(boolean retryAcquisition) {
    this.retryAcquisition = retryAcquisition;
}

public boolean getRetryAcquisition(boolean retryAcquisition) {
    return this.retryAcquisition;
}

public void setAcceptBadQualityEnrollment(boolean acceptBadQualityEnrollment) {
    this.acceptBadQualityEnrollment = acceptBadQualityEnrollment;
}

public boolean getAcceptBadQualityEnrollment(boolean acceptBadQualityEnrollment) {
    return this.acceptBadQualityEnrollment;
}

public void setShowQualityBar(boolean showQualityBar) {
    this.showQualityBar = showQualityBar;
}

public boolean getShowQualityBar(boolean showQualityBar) {
    return this.showQualityBar;
}

public void setShowQualityThreshold(boolean showQualityThreshold) {
    this.showQualityThreshold = showQualityThreshold;
}

public boolean getShowQualityThreshold(boolean showQualityThreshold) {
    return this.showQualityThreshold;
}

public void setTimeout(int timeout) {
    this.timeout = timeout;
}

public int getTimeout(int timeout) {
    return this.timeout;
}

public void setTimeoutQualityCoder(int timeoutQualityCoder) {
    this.timeoutQualityCoder = timeoutQualityCoder;
}

public int getTimeoutQualityCoder(int timeoutQualityCoder) {
    return this.timeoutQualityCoder;
}

public void setEnrollSecurityLevel(int enrollSecurityLevel) {
    this.enrollSecurityLevel = enrollSecurityLevel;
}

public int getEnrollSecurityLevel(int enrollSecurityLevel) {
    return this.enrollSecurityLevel;
}

public void setSecurityLevelCompatibility(boolean securityLevelCompatibility) {
    this.securityLevelCompatibility = securityLevelCompatibility;
}

public boolean getSecurityLevelCompatibility(boolean securityLevelCompatibility) {
    return this.securityLevelCompatibility;
}

public void setLiveImage(boolean liveImage) {
    this.liveImage = liveImage;
}

public boolean getLiveImage(boolean liveImage) {
    return this.liveImage;
}

public void setSetCulture(java.lang.String setCulture) {
    this.setCulture = setCulture;
}

public java.lang.String getSetCulture(java.lang.String setCulture) {
    return this.setCulture;
}

public void setAuthenticationScore(int authenticationScore) {
    this.authenticationScore = authenticationScore;
}

public int getAuthenticationScore(int authenticationScore) {
    return this.authenticationScore;
}

public int getPropertyCount() {
    return 15;
}

public Object getProperty(int __index) {
    switch(__index)  {
    case 0: return new Integer(coderAlgorithm);
    case 1: return new Integer(templateFormat);
    case 2: return new Boolean(juvenileMode);
    case 3: return new Integer(qualityThreshold);
    case 4: return new Boolean(retryAcquisition);
    case 5: return new Boolean(acceptBadQualityEnrollment);
    case 6: return new Boolean(showQualityBar);
    case 7: return new Boolean(showQualityThreshold);
    case 8: return new Integer(timeout);
    case 9: return new Integer(timeoutQualityCoder);
    case 10: return new Integer(enrollSecurityLevel);
    case 11: return new Boolean(securityLevelCompatibility);
    case 12: return new Boolean(liveImage);
    case 13: return setCulture;
    case 14: return new Integer(authenticationScore);
    }
    return null;
}

public void setProperty(int __index, Object __obj) {
    switch(__index)  {
    case 0: coderAlgorithm = Integer.parseInt(__obj.toString()); break;
    case 1: templateFormat = Integer.parseInt(__obj.toString()); break;
    case 2: juvenileMode = "true".equals(__obj.toString()); break;
    case 3: qualityThreshold = Integer.parseInt(__obj.toString()); break;
    case 4: retryAcquisition = "true".equals(__obj.toString()); break;
    case 5: acceptBadQualityEnrollment = "true".equals(__obj.toString()); break;
    case 6: showQualityBar = "true".equals(__obj.toString()); break;
    case 7: showQualityThreshold = "true".equals(__obj.toString()); break;
    case 8: timeout = Integer.parseInt(__obj.toString()); break;
    case 9: timeoutQualityCoder = Integer.parseInt(__obj.toString()); break;
    case 10: enrollSecurityLevel = Integer.parseInt(__obj.toString()); break;
    case 11: securityLevelCompatibility = "true".equals(__obj.toString()); break;
    case 12: liveImage = "true".equals(__obj.toString()); break;
    case 13: setCulture = (java.lang.String) __obj; break;
    case 14: authenticationScore = Integer.parseInt(__obj.toString()); break;
    }
}

public void getPropertyInfo(int __index, Hashtable __table, PropertyInfo __info) {
    switch(__index)  {
    case 0:
        __info.name = "coderAlgorithm";
        __info.type = Integer.class; break;
    case 1:
        __info.name = "templateFormat";
        __info.type = Integer.class; break;
    case 2:
        __info.name = "juvenileMode";
        __info.type = Boolean.class; break;
    case 3:
        __info.name = "qualityThreshold";
        __info.type = Integer.class; break;
    case 4:
        __info.name = "retryAcquisition";
        __info.type = Boolean.class; break;
    case 5:
        __info.name = "acceptBadQualityEnrollment";
        __info.type = Boolean.class; break;
    case 6:
        __info.name = "showQualityBar";
        __info.type = Boolean.class; break;
    case 7:
        __info.name = "showQualityThreshold";
        __info.type = Boolean.class; break;
    case 8:
        __info.name = "timeout";
        __info.type = Integer.class; break;
    case 9:
        __info.name = "timeoutQualityCoder";
        __info.type = Integer.class; break;
    case 10:
        __info.name = "enrollSecurityLevel";
        __info.type = Integer.class; break;
    case 11:
        __info.name = "securityLevelCompatibility";
        __info.type = Boolean.class; break;
    case 12:
        __info.name = "liveImage";
        __info.type = Boolean.class; break;
    case 13:
        __info.name = "setCulture";
        __info.type = java.lang.String.class; break;
    case 14:
        __info.name = "authenticationScore";
        __info.type = Integer.class; break;
    }
}
}

1 个解决方案

#1


0  

After several days of research i understood that WSDL autogenerated code parse Properties but not Atrributes. So what i did was this:

经过几天的研究,我明白WSDL自动生成的代码解析属性但不解析Atrributes。所以我做的是这样的:

First i generate the stub code from my WSDL in this website: http://www.wsdl2code.com/pages/home.aspx

首先,我在本网站的WSDL中生成存根代码:http://www.wsdl2code.com/pages/home.aspx

My webservice name is "nutriment" son when you call it in MainActivity you have to do this:

当你在MainActivity中调用它时,我的web服务名称是“nutriment”的儿子,你必须这样做:

        nutriment nws= new nutriment();
        BiometricConfigurationResponse respuesta = nws.GetBiometricConfiguration();

        Log.i(TAG, String.valueOf(respuesta.coderAlgorithm));
        Log.i(TAG, String.valueOf(respuesta.templateFormat));

But it responses 0 in all cases because the WDSL stub files are parsing PROPERTIES NOT ATRIBUTES, so when you open the serialization generated file you'll got something like this:

但它在所有情况下都会响应0,因为WDSL存根文件正在解析PROPERTIES NOT ATRIBUTES,因此当您打开序列化生成的文件时,您将得到如下内容:

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import java.util.Hashtable;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;

public class BiometricConfigurationResponse implements KvmSerializable {

    public int coderAlgorithm;
    public int templateFormat;


    public BiometricConfigurationResponse(){}

    public BiometricConfigurationResponse(SoapObject soapObject)
    {
        if (soapObject == null)
            return;
        if (soapObject.hasProperty("coderAlgorithm"))
        {
            Object obj = soapObject.getProperty("coderAlgorithm");
            if (obj != null && obj.getClass().equals(SoapObject.class)){
                SoapPrimitive j =(SoapPrimitive) obj;
                coderAlgorithm = Integer.parseInt(j.toString());
               }
           else if (obj!= null && obj instanceof Number){
                coderAlgorithm = (Integer) obj;
            }


        }

        if (soapObject.hasProperty("templateFormat"))
        {
            Object obj = soapObject.getProperty("templateFormat");
            if (obj != null && obj.getClass().equals(SoapPrimitive.class)){
                SoapPrimitive j =(SoapPrimitive) obj;
                templateFormat = Integer.parseInt(j.toString());
            }else if (obj!= null && obj instanceof Number){
                templateFormat = (Integer) obj;
            }

        }

    }
    @Override
    public Object getProperty(int arg0) {
        switch(arg0){
            case 0:
                return coderAlgorithm;
            case 1:
                return templateFormat;

        }
        return null;
    }

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

    @Override
    public void getPropertyInfo(int index, @SuppressWarnings("rawtypes") Hashtable arg1, PropertyInfo info) {
        switch(index){
            case 0:
                info.type = PropertyInfo.INTEGER_CLASS;
                info.name = "coderAlgorithm";
                break;
            case 1:
                info.type = PropertyInfo.INTEGER_CLASS;
                info.name = "templateFormat";
                break;

    }

    @Override
    public void setProperty(int arg0, Object arg1) {
    }

    @Override
    public String getInnerText() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setInnerText(String arg0) {
        // TODO Auto-generated method stub

    }

}

The trick is to modify the parsing so instead of get the properties(e.g.):

诀窍是修改解析,而不是获取属性(例如):

if (soapObject.hasProperty("coderAlgorithm")){
     Object obj = soapObject.getProperty("coderAlgorithm");
     if (obj != null && obj.getClass().equals(SoapObject.class)){
        SoapPrimitive j =(SoapPrimitive) obj;
        coderAlgorithm = Integer.parseInt(j.toString());
     }
     else if (obj!= null && obj instanceof Number){
     coderAlgorithm = (Integer) obj;
    }
}

Get the ATTRIBUTES (e.g.):

获取属性(例如):

if (soapObject.hasAttribute("coderAlgorithm")) {
    Object obj = soapObject.getAttribute("coderAlgorithm");
    if (obj != null && obj.getClass().equals(SoapObject.class)){
       SoapPrimitive j =(SoapPrimitive) obj;
       coderAlgorithm = Integer.parseInt(j.toString());
    }
    else if (obj!= null && obj instanceof Number){
       coderAlgorithm = (Integer) obj;
   }
   else if (obj!= null && obj instanceof String){
       coderAlgorithm = Integer.parseInt(obj.toString());
  }
}

#1


0  

After several days of research i understood that WSDL autogenerated code parse Properties but not Atrributes. So what i did was this:

经过几天的研究,我明白WSDL自动生成的代码解析属性但不解析Atrributes。所以我做的是这样的:

First i generate the stub code from my WSDL in this website: http://www.wsdl2code.com/pages/home.aspx

首先,我在本网站的WSDL中生成存根代码:http://www.wsdl2code.com/pages/home.aspx

My webservice name is "nutriment" son when you call it in MainActivity you have to do this:

当你在MainActivity中调用它时,我的web服务名称是“nutriment”的儿子,你必须这样做:

        nutriment nws= new nutriment();
        BiometricConfigurationResponse respuesta = nws.GetBiometricConfiguration();

        Log.i(TAG, String.valueOf(respuesta.coderAlgorithm));
        Log.i(TAG, String.valueOf(respuesta.templateFormat));

But it responses 0 in all cases because the WDSL stub files are parsing PROPERTIES NOT ATRIBUTES, so when you open the serialization generated file you'll got something like this:

但它在所有情况下都会响应0,因为WDSL存根文件正在解析PROPERTIES NOT ATRIBUTES,因此当您打开序列化生成的文件时,您将得到如下内容:

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import java.util.Hashtable;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;

public class BiometricConfigurationResponse implements KvmSerializable {

    public int coderAlgorithm;
    public int templateFormat;


    public BiometricConfigurationResponse(){}

    public BiometricConfigurationResponse(SoapObject soapObject)
    {
        if (soapObject == null)
            return;
        if (soapObject.hasProperty("coderAlgorithm"))
        {
            Object obj = soapObject.getProperty("coderAlgorithm");
            if (obj != null && obj.getClass().equals(SoapObject.class)){
                SoapPrimitive j =(SoapPrimitive) obj;
                coderAlgorithm = Integer.parseInt(j.toString());
               }
           else if (obj!= null && obj instanceof Number){
                coderAlgorithm = (Integer) obj;
            }


        }

        if (soapObject.hasProperty("templateFormat"))
        {
            Object obj = soapObject.getProperty("templateFormat");
            if (obj != null && obj.getClass().equals(SoapPrimitive.class)){
                SoapPrimitive j =(SoapPrimitive) obj;
                templateFormat = Integer.parseInt(j.toString());
            }else if (obj!= null && obj instanceof Number){
                templateFormat = (Integer) obj;
            }

        }

    }
    @Override
    public Object getProperty(int arg0) {
        switch(arg0){
            case 0:
                return coderAlgorithm;
            case 1:
                return templateFormat;

        }
        return null;
    }

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

    @Override
    public void getPropertyInfo(int index, @SuppressWarnings("rawtypes") Hashtable arg1, PropertyInfo info) {
        switch(index){
            case 0:
                info.type = PropertyInfo.INTEGER_CLASS;
                info.name = "coderAlgorithm";
                break;
            case 1:
                info.type = PropertyInfo.INTEGER_CLASS;
                info.name = "templateFormat";
                break;

    }

    @Override
    public void setProperty(int arg0, Object arg1) {
    }

    @Override
    public String getInnerText() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setInnerText(String arg0) {
        // TODO Auto-generated method stub

    }

}

The trick is to modify the parsing so instead of get the properties(e.g.):

诀窍是修改解析,而不是获取属性(例如):

if (soapObject.hasProperty("coderAlgorithm")){
     Object obj = soapObject.getProperty("coderAlgorithm");
     if (obj != null && obj.getClass().equals(SoapObject.class)){
        SoapPrimitive j =(SoapPrimitive) obj;
        coderAlgorithm = Integer.parseInt(j.toString());
     }
     else if (obj!= null && obj instanceof Number){
     coderAlgorithm = (Integer) obj;
    }
}

Get the ATTRIBUTES (e.g.):

获取属性(例如):

if (soapObject.hasAttribute("coderAlgorithm")) {
    Object obj = soapObject.getAttribute("coderAlgorithm");
    if (obj != null && obj.getClass().equals(SoapObject.class)){
       SoapPrimitive j =(SoapPrimitive) obj;
       coderAlgorithm = Integer.parseInt(j.toString());
    }
    else if (obj!= null && obj instanceof Number){
       coderAlgorithm = (Integer) obj;
   }
   else if (obj!= null && obj instanceof String){
       coderAlgorithm = Integer.parseInt(obj.toString());
  }
}