gpt4 book ai didi

java - 使用 ksoap2 解析 XML 响应属性时出错返回 ClassCastException

转载 作者:太空宇宙 更新时间:2023-11-04 13:56:00 25 4
gpt4 key购买 nike

我试图弄清楚如何转换 Web 服务消耗的响应,当将响应 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;
}
}
}

最佳答案

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

首先,我从本网站中的 WSDL 生成 stub 代码: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 stub 文件正在解析属性而不是属性,因此当您打开序列化生成的文件时,您将得到如下内容:

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

关于java - 使用 ksoap2 解析 XML 响应属性时出错返回 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com