【问题标题】:Error Parsing XML response attributes with ksoap2 returns ClassCastException使用 ksoap2 解析 XML 响应属性时出错返回 ClassCastException
【发布时间】:2015-06-30 23:54:14
【问题描述】:

我试图弄清楚如何将响应 envelope.bodyIn 转换为我的扩展类对象“BiometricConfigurationResponse”时,我收到了这个错误:

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

【问题讨论】:

标签: java android xml android-ksoap2 stub


【解决方案1】:

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

首先我在这个网站上从我的 WSDL 生成存根代码:http://www.wsdl2code.com/pages/home.aspx

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

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

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

但它在所有情况下都响应 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

    }

}

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

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

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多