2012-03-17 22 views
1

私のアプリケーションからWebサービスを呼び出そうとしています。私は、入力として文字列またはプリミティブを受け入れ、Webサービスメソッドを呼び出す場合、それは正常に動作しますが、(私の場合は試料クラスの)複雑なオブジェクトを受け取り、Webサービスメソッドを呼び出すときに、私はエラー複雑なオブジェクトをWebサービスに渡す

org.apache.axis2.AxisFault: Unknow type {http://spec.com}specimen 
    at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:349) 
    at org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:827) 
    at org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:746) 

を次取得I以下午前:私は、Webサービスエクスプローラで私のWebサービスをテストしているし、その作業fine.Hereがここに私のウェブサービス

package com.spec; 

public class Spec { 

    public String sayHello(String name) // I can successfully invoke this 
    { 
     return "Have a great day " + name; 
    } 

    public String saveSpecimen(Specimen specimen) // Getting error for this 
    { 
     System.out.println("id: " + specimen.getId()); 
     System.out.println("name: " + specimen.getName()); 
     return "Specimend with id " + specimen.getId() + " is successfully saved"; 
    } 
} 

あるhttp://seesharpgears.blogspot.in/2010/10/ksoap-android-web-service-tutorial-with.html

は私標本クラス

です私は、問題はここ

envelope.addMapping(WSDL_TARGET_NAMESPACE, "specimen",new Specimen().getClass()); 

であると思い活動

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, 
       OPERATION_NAME); 

     Specimen specimen = new Specimen(); 
     specimen.setId(1); 
     specimen.setName("Test_Specimen"); 
     PropertyInfo info = new PropertyInfo(); 
     info.setName("specimen"); 
     info.setValue(specimen); 
     info.setType(specimen.getClass()); 
     request.addProperty(info); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
     envelope.setOutputSoapObject(request); 
     envelope.addMapping(WSDL_TARGET_NAMESPACE, "specimen",new Specimen().getClass()); 
     HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
      httpTransport.call(SOAP_ACTION, envelope); 
      SoapObject response = (SoapObject)envelope.getResponse(); 
      Toast.makeText(getApplicationContext(),"Msg from web servce "  +    response.toString(),Toast.LENGTH_LONG).show(); 

から

package com.ws; 

import java.util.Hashtable; 

import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class Specimen implements KvmSerializable { 
    int id; 
    String name; 

    public Specimen() { 
    } 

    public Specimen(int idValue, String nameValue) { 
     id = idValue; 
     name = nameValue; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Object getProperty(int arg0) { 
     if (arg0 == 0) 
      return id; 
     else 
      return name; 
    } 

    public int getPropertyCount() { 
     // TODO Auto-generated method stub 
     return 2; 
    } 

    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) { 
     switch (arg0) { 
     case 0: 
      info.type = PropertyInfo.INTEGER_CLASS; 
      info.name = "id"; 
      break; 
     case 1: 
      info.type = PropertyInfo.STRING_CLASS; 
      info.name = "name"; 
      break; 
     default: 
      break; 
     } 
    } 

    public void setProperty(int arg0, Object value) { 
     switch (arg0) { 
     case 0: 
      id = Integer.parseInt(value.toString()); 
      break; 
     case 1: 
      name = value.toString(); 
      break; 
     } 
    } 
} 

スニペットは、WSDLファイル内の私の検体複合型の宣言

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" argetNamespace="http://spec.com/xsd"> 
<xs:complexType name="Specimen"> 
<xs:sequence> 
<xs:element minOccurs="0" name="id" type="xs:int"/> 
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/></xs:sequence></xs:complexType> 
</xs:schema> 

ある場合は私に知らせてください私は何の失敗もしている。

ありがとうございます!

+0

大文字のenvelope.addMapping(WSDL_TARGET_NAMESPACE、 "Specimen"、新しいSpecimen()。getClass())を作成しようとします。それが動作するかどうかを確認しますか?私はわかりません。 – riship89

+0

@ hrishikeshp19:試してみました.. – xyz

+1

ここを訪れましたか?> http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks#sending/receiving_array_of_complex_types_or_primitives? – OguzOzkeroglu

答えて

0

たくさん試してみましたが、うまくいきませんでした。更新されたWebサービスを単純​​なパラメータに変換し、オブジェクトに存在するすべての属性を渡しました。

1

このお試しください:それは動作しない場合

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("Specimen", specimen); 
SoapSerializationEnvelope envelope = 
     new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true; 
envelope.setOutputSoapObject(request); 
envelope.addMapping("http://spec.com/xsd", "Specimen", new Specimen().getClass()); 

try { 
    HttpTransportSE transport = new HttpTransportSE(SOAP_ADDRESS); 
    transport.call(NAMESPACE + METHOD_NAME, envelope); 
    Object response = envelope.getResponse(); 
    String result = response.toString(); 
    /* make a toast ... */ 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

を、あなたのWSDL_TARGET_NAMESPACE、OPERATION_NAMEとアドレスの文字列を投稿してください。

+0

あなたの提案を試みましたが、 'ArrayIndexOutofBoundExeption'を得ることはできませんでした。 – xyz

+0

多分、エラーは私が応答を得る方法です、その行を変更しようとします。私は残念だと思います。 –

+0

@enmarc: 'envelop.getResponse'が' arrayIndexOutofBoundException'を引き起こすとは思わない – xyz

関連する問題