2011-07-25 7 views
0

私はandroidとksoap2を使っていくつかのチュートリアルを見てきました。私のサービスは、アンドロイドクライアントから石鹸サービスへのパラメータとして文字列を送るのにうまくいきます。ksoap2を使ってアンドロイドから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'インスタンスが必要です。

package soap.service.data; 

public class ClientProfile { 
    public int ram; 
    public String cpu; 
    public String bandwidth; 
} 

ここでも、非常にシンプル:サーバ側の 'ClientProfile' クラスは次のようになります。しかし、これは私のアンドロイド(クライアント)パッケージの 'ClientProfile'クラスとまったく同じですか?

アンドロイド側では、物事は少し異なります。 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); 

また、非常に簡単です。しかし、Webサービスの操作がksoap2を使ってAndroidのエミュレータで起動され、サーバー側、に、私は「ヌルを得る

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

:私のアンドロイドプロジェクト(クライアント側)マイClientProfileクラスは次のようになります'私はパラメータとして渡されるClientProfileインスタンスを出力しようとすると。それは本当の痛みです。

すべてのチュートリアルでは、Webサービス側ではなく、Android側からのクラスパラメータが表示されます。

私は多分シリアル化の問題があると仮定していますか?いずれにせよ、例外はありません。 Webサービスからの応答がアンドロイドのクライアントに戻ってくるので、これは問題ではありません。

Webサービス側のパラメータがnullであるという根本的な問題があります。私のWebサービス操作のコードは次のとおりです。

私は完全に固執していますので、ここで助けていただければ幸いです。私は私のアンドロイドエミュレータとlocalhost上で動作しているWebサービスとの間のスープメッセージを出力する方法を知らない。

私はこれについて前に質問しましたが、残念ながら返信はありませんでした。

ありがとうございます。

答えて

1

答えはhereです。 JAX-WSを使用して、誰のために、あなた必見は、あなたがこれを行うと、それが動作するはずサービス・エンドポイント・インタフェース

@WebService(name = "ImageSei", targetNamespace = "http://image.webservice") 
public interface ImageSei { 
    public String getImage(@WebParam(name = "c")ClientProfile c); 
} 

におけるパラメータの注釈が含まれています。出力は次のとおりです。

[email protected] 
関連する問題