2

ログインビューがあります。ビューから、ユーザーがユーザー名、パスワードを入力すると、それらをWebサービスに送信する必要があります。次に、サービスは資格情報を検証し、ID(customerid)を返します。

サービスには、「Credential」クラスのオブジェクトを送信する必要があります。

クラス:

public class Credetials {

    private String username;
    private String password;


    public Credetials(){}

    public String getUserName(){
        return this.username;
    }
    public void setUserName(String uname){
        this.username=uname;
    }

    public String getPassword(){
        return this.password;
    }
    public void setPassword(String password){
        this.password=password;
    }


}

ビュー/アクティビティ:

loginButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            /* reading username and password*/
            String username=loginname.getText().toString();
            String password=logincode.getText().toString();

            Credetials credentials=new Credetials();
            credentials.setUserName(username);
            credentials.setPassword(password);

            Log.d("username", credentials.getUserName());
            Log.d("password", credentials.getPassword());
            **// here i have proper username and password.**

            new callGetCustomerId().execute(credentials);


        }
    });
class callGetCustomerId extends AsyncTask<Object, Void, String>{
    @Override
    protected String doInBackground(Object... params) {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("credentials", params[0]);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try{
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapObject response = (SoapObject) envelope.getResponse();

            return response.toString();


        }catch(Exception e){
            return e.getMessage();
        }

    }
    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();

    }
}

問題:

今問題はそれが常にキャッチブロックに行くということです。エラーは、「シリアル化できません:blah blah..Credentials @413....」のようなものを示し ています。誰かが私が間違っていることを手伝ってくれますか。??

以前は正常に機能する単一の文字列パラメータを送信しました...したがって、「credential」オブジェクトの送信方法が間違っている可能性があります。

編集:

これはWebサービスからです

<xs:complexType name="getCustomerId">
 <xs:sequence>
  <xs:element name="credetials" type="tns:credentials" minOccurs="0"/>
 </xs:sequence>

編集2:

多くのことを試した後、次の応答ダンプがあります。

aht responseDump is :
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">     <faultcode>S:Server</faultcode>
<faultstring>java.lang.NullPointerException</faultstring>
<detail><ns2:exception xmlns:ns2="http://jax-ws.dev.java.net/"     class="java.lang.NullPointerException" 
note="To disable this feature, set   com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false">
<ns2:stackTrace><ns2:frame class="presentation.ws.ElderlyWebServiceImpl"  file="ElderlyWebServiceImpl.java" line="196" method="getNurseId"/>
<ns2:frame class="sun.reflect.GeneratedMethodAccessor1173" line="unknown" method="invoke"/><ns2:frame class="sun.reflect.DelegatingMethodAccessorImpl" 

file = "DelegatingMethodAccessorImpl.java" line = "25" method = "invoke" />

だからこれは私が応答として持っているものです...私がクライアントでする必要があることはありますか?またはサービスは何かを変更する必要がありますか?

編集:3

これが今のコードの様子です。

クラス

public class Credetials implements KvmSerializable{

    /**
 * 
 */
private static final long serialVersionUID = 920795244030577363L;
    /**
 * 
 */

    private String username;
    private String password;


    public Credetials(){}

    public Credetials(String username,String password){
        this.username=username;
        this.password=password;
    }
    public Object getProperty(int index) {
        Object object = null;
        switch (index)
        {
            case 0:
            {
                object = this.username;
                break;
            }
            case 1:
            {
                object = this.password;
                break;
            }

        }
        return object;
    }

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

    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo propertyInfo) {
        // TODO Auto-generated method stub
        switch (index)
        {
            case 0:
            {
                propertyInfo.name = "username";
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            }
            case 1:
            {
                propertyInfo.name="password";
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;

            }
        }
    }

    public void setProperty(int index, Object obj) {
        // TODO Auto-generated method stub
        switch (index)
        {
        case 0:
        {
            this.username = obj.toString();
            break;
        }
        case 1:
        {
            this.password = obj.toString();
            break;
        }
    }

    }
}

これはアクティビティです:

private static final String SOAP_ACTION = "";
private static final String NAMESPACE = "mynamespace";
private static final String METHOD_NAME = "getCustomerId";
private static final String URL = "myurl";


The asynctask
----------------

class callGetCustomerId extends AsyncTask<Object, Void, String>{
    @Override
    protected String doInBackground(Object... params) {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

        Credetials cred=new Credetials("username","password");


        PropertyInfo credPropertyinfo=new PropertyInfo();
        credPropertyinfo.setName("credentials");
        credPropertyinfo.setValue(cred);
        credPropertyinfo.setType(cred.getClass());

        request.addProperty(credPropertyinfo);

    SoapSerializationEnvelope envelope = new  SoapSerializationEnvelope(SoapEnvelope.VER11);

     envelope.setOutputSoapObject(request);
     envelope.addMapping(NAMESPACE, Credetials.class.getSimpleName(), Credetials.class);
     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
     androidHttpTransport.debug=true;

     try{
            //Log.d("intotry", "inside try");
            androidHttpTransport.call(SOAP_ACTION, envelope);

            System.out.println("aht requestDump is :"+androidHttpTransport.requestDump);
            System.out.println("aht responseDump is :"+androidHttpTransport.responseDump);

            SoapObject response = (SoapObject) envelope.bodyIn;



            //return response.toString();
            return "call success";


        }catch(Exception e){
            //return e.getMessage();
            return e.toString();
        }

    }
    @Override
    protected void onPostExecute(String result){
        super.onPostExecute(result);

        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
        //

    }
}

WSDL

<xs:complexType name="credentials">
<xs:sequence>
<xs:element name="password" type="xs:string" minOccurs="0"/>
<xs:element name="username" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="getCustomerId">
<xs:sequence>
<xs:element name="credetials" type="tns:credentials" minOccurs="0"/>
</xs:sequence>

</xs:complexType>
<xs:complexType name="getCustomerIdResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

私は出力ダンプの上に書きました。

4

0 に答える 0