我看了几个使用android和ksoap2的教程。我的服务适用于从android客户端发送字符串作为参数到soap服务。
现在,如果我想传递一个对象,而不是传递一个字符串。但是,它对我不起作用。
在服务器端,我有以下Web服务操作(我正在使用jax-ws)。
package soap.service.sei;
import javax.jws.WebService;
import soap.service.data.ClientProfile;
@WebService(name = "ImageSei", targetNamespace = "http://image.webservice")
public interface ImageSei {
public String getImage(ClientProfile c);
}
很简单。如您所见,Web服务操作采用“ClientProfile”实例。 服务器端 上的“ClientProfile”类如下所示:
package soap.service.data;
public class ClientProfile {
public int ram;
public String cpu;
public String bandwidth;
}
再次,非常简单。但是,这应该与我的android(客户端)包中的'ClientProfile'类完全相同吗?
确定。在android方面,事情有点不同。我有以下用于调用Web服务的代码片段:
ClientProfile c = new ClientProfile();
c.ram = 256;
c.cpu = "22.445";
c.bandwidth = "712.2";
prop.setName("c");
prop.setValue(c);
prop.setType(c.getClass());
request.addProperty(prop);
再次,非常直截了当。我的 android项目(客户端) 中的我的ClientProfile类如下所示:
package soap.service.data;
import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class ClientProfile implements KvmSerializable {
public int ram;
public String cpu;
public String bandwidth;
public ClientProfile() {}
public ClientProfile(int $ram, String $cpu, String $bandwidth) {
ram = $ram;
cpu = $cpu;
bandwidth = $bandwidth;
}
@Override
public Object getProperty(int arg0) {
switch(arg0) {
case 0 :
return ram;
case 1 :
return cpu;
case 2 :
return bandwidth;
}
return null;
}
@Override
public int getPropertyCount() {
return 3;
}
@Override
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch(index) {
case 0 :
info.type = PropertyInfo.INTEGER_CLASS;
info.name = "ram";
break;
case 1 :
info.type = PropertyInfo.STRING_CLASS;
info.name = "cpu";
break;
case 2 :
info.type = PropertyInfo.STRING_CLASS;
info.name = "bandwidth";
break;
default :
break;
}
}
@Override
public void setProperty(int index, Object value) {
switch(index) {
case 0 :
ram = Integer.parseInt(value.toString());
break;
case 1 :
cpu = value.toString();
break;
case 2 :
bandwidth = value.toString();
break;
default :
break;
}
}
}
但是,在服务器端,当android模拟器使用ksoap2调用Web服务操作时,当我尝试输出作为参数传递的ClientProfile实例时,我得到'null'。这是一个真正的痛苦。
所有教程都只显示了android端的class参数,而不是web服务端。
我假设可能存在某种序列化问题?无论如何,我没有例外。来自Web服务的响应很好地回到了android客户端,所以这不是问题。
基本问题是Web服务端的参数为null。这是我的Web服务操作的代码:
@Override
public String getImage(ClientProfile c) {
System.out.println(c); // ***** THIS IS NULL *****
byte[] imageBytes = null;
try {
//...
} catch (IOException ioe) {
ioe.printStackTrace();
}
return (imageBytes != null) ? Base64.encodeBase64String(imageBytes) : "";
}
我非常感谢这里的一些帮助,因为我完全陷入困境。我不知道如何在我的android模拟器和localhost上运行的web服务之间打印出汤消息。
之前我问了一个关于此的问题,但遗憾的是没有回复。
谢谢。
答案 0 :(得分:1)
我找到了答案here。对于使用jax-ws的任何人, 必须 在服务端点接口中包含参数的注释
@WebService(name = "ImageSei", targetNamespace = "http://image.webservice")
public interface ImageSei {
public String getImage(@WebParam(name = "c")ClientProfile c);
}
一旦你这样做,它应该工作。输出如下:
soap.service.data.ClientProfile@349471