私はksoap2を使用してAndroidでJavaWebサービスを呼び出しています。Java Webサービスの方法は、
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
ImageProcessDAO.java
public static String sample(UserRequest userRequest) {
System.out.println(userRequest.getClientName());
UserResponse UserResponse = new UserResponse();
userResponse.setMessage("SUCCESS");
return userResponse;
}
私はAndroidからこれらのWebサービスを次のように呼んでいます。
try{
String NAMESPACE = "http://impl.test.com";
String URL = "http://10.0.2.2:8080/Webservice/services/ImageProcessImpl?wsdl";
String SOAP_ACTION = "http://impl.test.com/sample";
String METHOD_NAME = "sample";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
UserRequest userRequest = new UserRequest();
userRequest.setClientName("Test");
PropertyInfo pi = new PropertyInfo();
pi.setName("userRequest");
pi.setValue(userRequest);
pi.setType(UserRequest.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.implicitTypes = true;
envelope.addMapping(NAMESPACE, "UserResponse", UserResponse.class);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
httpTransport.call(SOAP_ACTION, envelope);
UserResponse response = (UserResponse) envelope.getResponse();
Log.e(Test.LOG_TAG, response.getMessage());
}catch (Exception e) {
Log.e(Test.LOG_TAG, "throws an exception: " + e.getMessage());
}
しかし、Logcatで「例外をスローします:シリアル化できません:com.test.common.UserRequest」というエラーが発生します。このエラーを修正するにはどうすればよいですか?これは、複雑なタイプのWebサービスを呼び出す正しい方法ですか?
私のwsdlファイルは、
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://impl.test.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.test.com" xmlns:intf="http://impl.test.com" xmlns:tns1="http://common.test.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://impl.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://common.test.com"/>
<element name="sample">
<complexType>
<sequence>
<element name="userRequest" type="tns1:UserRequest"/>
</sequence>
</complexType>
</element>
<element name="sampleResponse">
<complexType>
<sequence>
<element name="sampleReturn" type="tns1:UserResponse"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://common.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="UserRequest">
<sequence>
<element name="clientName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="UserResponse">
<sequence>
<element name="message" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="sampleRequest">
<wsdl:part element="impl:sample" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sampleResponse">
<wsdl:part element="impl:sampleResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ImageProcessImpl">
<wsdl:operation name="sample">
<wsdl:input message="impl:sampleRequest" name="sampleRequest">
</wsdl:input>
<wsdl:output message="impl:sampleResponse" name="sampleResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImageProcessImplSoapBinding" type="impl:ImageProcessImpl">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sample">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sampleRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sampleResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImageProcessImplService">
<wsdl:port binding="impl:ImageProcessImplSoapBinding" name="ImageProcessImpl">
<wsdlsoap:address location="http://localhost:8080/Webservice/services/ImageProcessImpl"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
KvmSerializableを使用しました。private Client[] clientNameList = null;
UserRequest.javaにもう1つの配列Bean変数を追加
しました。
Webサービスに電話すると、リクエストで正常に機能しています。しかし、応答では、すべての値を含む1つの文字列を取得しています。応答文字列を以下に示します。
anyType{clientNameList=anyType{clientNameList=anyType{clientID=1; }; clientNameList=anyType{clientID=2; }; }; message=SUCCESS; }.
この文字列を解析するにはどうすればよいですか?
UserResponse.java
public class UserResponse implements KvmSerializable{
public String message = null;
public Client[] clientNameList = null;
@Override
public Object getProperty(int index) {
switch (index){
case 0:
return message;
case 1:
return clientNameList;
default:
return null;
}
}
@Override
public int getPropertyCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch(index)
{
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "message";
break;
case 1:
info.type = PropertyInfo.OBJECT_TYPE;
info.name = "clientNameList";
break;
default:
break;
}
}
@Override
public void setProperty(int index, Object value) {
switch(index)
{
case 0:
message = value.toString();
break;
case 1:
clientNameList = (Client[]) value;
break;
default:
break;
}
}
}
Client.javaには、整数型のclientIdのみが含まれています。
更新されたコードとwsdl
ImageProcessImpl.java
public UserResponse sample(UserRequest userRequest) {
return ImageProcessDAO.sample(userRequest);
}
ImageProcessDAO.java
public static String sample(UserRequest userRequest) {
System.out.println(userRequest.getClientName());
UserResponse userResponse = new UserResponse();
userResponse.setMessage(SUCCESS);
Client[] clients = new Client[2];
Client client = null;
for(int i=0;i<2;i++)
{
client = new Client();
client.setClientID(i+1);
clients[i] = client;
}
userResponse.setClientNameList(clients);
return userResponse;
}
私はAndroidからこれらのWebサービスを次のように呼んでいます。
try{
String NAMESPACE = "http://impl.test.com";
String URL = "http://10.0.2.2:8080/Webservice/services/ImageProcessImpl?wsdl";
String SOAP_ACTION = "http://impl.test.com/sample";
String METHOD_NAME = "sample";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
UserRequest userRequest = new UserRequest();
userRequest.setClientName("Test");
PropertyInfo pi = new PropertyInfo();
pi.setName("userRequest");
pi.setValue(userRequest);
pi.setType(UserRequest.class);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.implicitTypes = true;
envelope.addMapping(NAMESPACE, "userRequest", UserRequest.class);
envelope.addMapping(NAMESPACE, "UserResponse", UserResponse.class);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
httpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject) envelope.getResponse();
userResponse.message = result.getProperty(0).toString();
Log.e(Test.LOG_TAG, userResponse.message);
}catch (Exception e) {
Log.e(Test.LOG_TAG, "throws an exception: " + e.getMessage());
}
私の新しいwsdlファイルは、
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://impl.test.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.test.com" xmlns:intf="http://impl.test.com" xmlns:tns1="http://common.test.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://impl.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://common.test.com"/>
<element name="sample">
<complexType>
<sequence>
<element name="userRequest" type="tns1:UserRequest"/>
</sequence>
</complexType>
</element>
<element name="sampleResponse">
<complexType>
<sequence>
<element name="sampleReturn" type="tns1:UserResponse"/>
</sequence>
</complexType>
</element>
<complexType name="ArrayOf_tns1_Client">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" type="tns1:Client"/>
</sequence>
</complexType>
</schema>
<schema elementFormDefault="qualified" targetNamespace="http://common.test.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://impl.test.com"/>
<complexType name="UserRequest">
<sequence>
<element name="clientName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="Client">
<sequence>
<element name="clientID" type="xsd:int"/>
</sequence>
</complexType>
<complexType name="UserResponse">
<sequence>
<element name="clientNameList" nillable="true" type="impl:ArrayOf_tns1_Client"/>
<element name="message" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="sampleRequest">
<wsdl:part element="impl:sample" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sampleResponse">
<wsdl:part element="impl:sampleResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ImageProcessImpl">
<wsdl:operation name="sample">
<wsdl:input message="impl:sampleRequest" name="sampleRequest">
</wsdl:input>
<wsdl:output message="impl:sampleResponse" name="sampleResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ImageProcessImplSoapBinding" type="impl:ImageProcessImpl">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sample">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sampleRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sampleResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ImageProcessImplService">
<wsdl:port binding="impl:ImageProcessImplSoapBinding" name="ImageProcessImpl">
<wsdlsoap:address location="http://localhost:8080/Webservice/services/ImageProcessImpl"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>