错误使用kso​​ap2解析XML响应属性会返回ClassCastException

时间:2015-04-23 02:29:55

标签: java android xml android-ksoap2 stub

我试图在将响应 envelope.bodyIn 转换为我的扩展类对象" BiometricConfigurationResponse&#34时,试图弄清楚如何投射网络服务消费的响应;我收到此错误:

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

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

这就是我正在做的事情:

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();
    }

这是我的自定义类

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 个答案:

答案 0 :(得分:0)

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

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

我的网络服务名称是" 营养素"儿子,当你在MainActivity中调用它时,你必须这样做:

while(true) {
     System.out.println("(1) Bubble Sort (2) Selection Sort (3) Insertion Sort");
     System.out.print("From the choices above, which selection sort would you like to choose: ");
     selectionSort = input.readLine();

     try {
        sortRunner = Integer.parseInt(selectionSort);

        if(sortRunner == 1) {
           // run bubble sort
           // print order
           break;
        }
        else if (sortRunner == 2) {
           // run Selection sort
           //print order
           break;
        }
        else if(sortRunner == 3) {
           // run selection sort
           // print order
           break;
        }
     }
     catch (NumberFormatExecption ex) {
        System.err.println("You need to enter a valid input when selection your selection sort. Try again.");
     }      
  }

但它在所有情况下都会响应0,因为WDSL存根文件正在解析 PROPERTIES NOT ATRIBUTES ,所以当你打开序列化生成的文件时,你会得到类似的结果:

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

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

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

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

    }

}

获取 ATTRIBUTES (例如):

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;
    }
}