2011-01-01 16 views
1

AndroidのwebserviceにはKsoap2経由でAndroidにアクセスしようとしています。HttpTransportSE requestDumpはNullPointerExceptionを返します

SoapObjectが作成されます。bodyOutのS.O.Pが目的の文字列を出力します。しかし、HttpTransportSEオブジェクトのrequestDumpを作成して呼び出しを行うと、NullPointerExceptionが発生します。つまり、移送オブジェクトはnullです。これはどうしたらできますか?

Webサービスは、このサービスはSOAPUIと非常によく動作しますhttp://srilanka.lk:9080/services/CropServiceProxy?wsdl

です。

SOAPUI要求:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
    <soap:Header/> 
    <soap:Body> 
     <v1:getCropDataList> 
     <v1:code>ABK</v1:code> 
     </v1:getCropDataList> 
    </soap:Body> 
</soap:Envelope> 

SOAPUI応答:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Body> 
     <ns1:getCropDataListResponse xmlns:ns1="http://schemas.icta.lk/xsd/crop/handler/v1/"> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>35.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     <ns1:cropInfo> 
      <ns1:name>Ambul Kesel</ns1:name> 
      <ns1:price>40.0</ns1:price> 
      <ns1:location>Dambulla</ns1:location> 
     </ns1:cropInfo> 
     </ns1:getCropDataListResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

クライアント側複合型KvmSerializable実装:

public class CropInfo implements KvmSerializable { 

private String name; 
private float price; 
private String location; 

@Override 
public Object getProperty(int arg0) { 
    switch (arg0){ 
    case 0: 
    return name; 
    case 1: 
    return price; 
    case 2: 
    return location; 
    default: 
    return null; 
    } 
} 

@Override 
public int getPropertyCount() { 
    return 3; 
} 

@Override 
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { 
    switch (arg0){ 
    case 0: 
    arg2.type = PropertyInfo.STRING_CLASS; 
    arg2.name = "Name"; 
    break; 
    case 1: 
    arg2.type = Float.class; 
    arg2.name = "Price"; 
    break; 
    case 2: 
    arg2.type = PropertyInfo.STRING_CLASS; 
    arg2.name = "Location"; 
    break; 
    default: 
    break; 
    } 

} 

@Override 
public void setProperty(int arg0, Object arg1) { 
    switch(arg0){ 
    case 0: 
    name = arg1.toString(); 
    break; 
    case 1: 
    price = Float.parseFloat(arg1.toString()); 
    case 2: 
    location = arg1.toString(); 
    default: 
    break; 
    } 
} 
} 

Webサービスコール:

public void btnOnClick(View v){ 
    String NAMESPACE = "http://schemas.icta.lk/xsd/crop/handler/v1/"; 
    String URL = "http://220.247.225.202:9080/services/CropServiceProxy.CropServiceProxyHttpSoap12Endpoint"; 

    String method_name = "getCropDataList"; 
    String SOAP_ACTION = "http://schemas.icta.lk/xsd/crop/handler/v1/getCropDataList"; 

    SoapObject soap_request = new SoapObject(NAMESPACE, method_name); 
    soap_request.addProperty("code", "ABK"); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
    envelope.setOutputSoapObject(soap_request); 
    envelope.addMapping(NAMESPACE, "cropInfo", CropInfo.class); 
    //envelope.dotNet=true; 

    Marshal floatMarshal = new MarshalFloat(); 
    floatMarshal.register(envelope); 

    System.out.println("body out : " + envelope.bodyOut.toString()); 

    //AndroidHttpTransport http_transport = new AndroidHttpTransport(URL); 
    HttpTransportSE http_transport = new HttpTransportSE(URL); 
    try { 
        //NullPointerException HERE 
    System.out.println(http_transport.requestDump); 
    http_transport.call(SOAP_ACTION, envelope); 

    //because we should expect a vector, two kinds of prices are given 
    Vector<CropInfo> result_array = (Vector<CropInfo>)envelope.getResponse(); 
    if(result_array != null){ 
    for (CropInfo current_crop: result_array){ 
    System.out.println(current_crop.getName()); 
    System.out.println(Float.toString(current_crop.getPrice())); 
    } 
    } 

    } catch (Exception e) { 
    e.printStackTrace(); 
    answer.setText("error caught"); 
    //System.out.println(http_transport.responseDump); 
    } 

    // String result_string[] = (String[])result; 

    //answer.setText("returned"); 

    } 

誰もがこれを説明できますか?

答えて

9

あなたは、設定するrequestDumpフィールドの順にcall(String,SoapEnvelope)メソッドを呼び出した後、trueTransportインスタンスのdebugフィールドを設定する必要があります。

HttpTransportSE http_transport = new HttpTransportSE(URL); 
    http_transport.debug = true; 
    try { 
    http_transport.call(SOAP_ACTION, envelope); 
    System.out.println(http_transport.requestDump); 
    //... 
+0

おかげでダニエル。私は注文が間違っている。あなたが提案した修正を行い、呼び出しメソッドでXMLPullParserエラーが発生しました。私はhttp://stackoverflow.com/questions/4557180/ksoap2-for-android-givesでそれに苦しんでいます。 – Chamila

+1

@Daniel dude私の心の底からあなたを愛しています** _ _あなたはこれらの小さなものについての情報を??私は別の[質問](http://stackoverflow.com/q/11048426/1434372)に尋ねました。その答えは@chamilaが持っていた問題に私を導いてくれました。回答者でさえhttpTransport .debug = true; '...うわー、私は** 2時間** ** 2 **のためにそれにこだわっていた今、本当に幸せです。私の_long_コメントをお寄せください。もう一度**ありがとう**! – Shark

関連する問題