ログインビューがあります。ビューから、ユーザーがユーザー名、パスワードを入力すると、それらを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>
私は出力ダンプの上に書きました。