2015-04-23 59 views
1

我试图弄清楚如何投射消息响应的web服务时,将响应envelope.bodyIn到我的扩展类对象“BiometricConfigurationResponse”i' m如果这个错误:错误使用kso​​ap2解析XML响应属性返回ClassCastException

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

的http://计算器.com/questions/9766893/ksoap2-android-adding-attributes-to-a-simple-property – VVB

+0

我觉得你没有正确的读过这个问题,不是要为请求添加属性,而是要解析这个属性从响应。 –

回答

0

经过研究好几天我了解,WSDL自动生成的代码解析的属性,但不是Atrributes。因此,我所做的是:

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

我的web服务的名称是“营养素”当你调用它在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存根文件解析性能未经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; 
    } 
} 

获取ATTRIBUTES(EG):

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