4

我正在尝试从 Android 客户端访问 Java Web 服务,但它显示错误:

“java.lang.classcastexception org.ksoap2.soapfault 不能转换为 org.ksoap2.serialization.soapobject”

你能帮助我吗?

这是我的客户端 Web 服务代码:

import java.lang.reflect.Method;

import android.app.Activity; 
import android.os.Bundle; 
import android.content.Context;
import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View;
import android.view.Window;
import android.widget.EditText;

import android.widget.TextView;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportSE; 

public class Loginuser extends Activity{


public static final int MENU1 = Menu.FIRST; 
public static final int MENU2 = Menu.FIRST + 1; 
public static final int MENU3 = Menu.FIRST + 2; 
public static Context group;

    private static final String SOAP_ACTION = "";
    private static final String METHOD_NAME = "logar";
    private static final String NAMESPACE = "http://wsproj.mycompany.com/";
    private static final String URL = "http://localhost:8084/wsproj/HelloWorld";


    EditText ura,pw; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.loginuser);

    }


    public void logar(View X) { 
    CarregaTelaBolarq();
    }

public void CarregaTelaBolarq(){

    ura=(EditText)findViewById(R.id.editText2);
    String raforn = ura.getText().toString();

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


    request.addProperty("raforn",ura.getText().toString());

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

    envelope.setOutputSoapObject(request);


try{

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    androidHttpTransport.call(SOAP_ACTION, envelope);

    SoapObject sp = (SoapObject)envelope.bodyIn;

    String result=sp.toString();

    if(result.equals("1"))

            {

               TextView tv; 
               tv=(TextView) findViewById(R.id.editText1);
               tv.setText("foi: ");
            }
            else
            {
                TextView tv; 
                tv=(TextView) findViewById(R.id.editText1);
                tv.setText("Msg from service: ");
            }       

        }
        catch(Exception e)
        {

            TextView tv=(TextView) findViewById(R.id.editText1);
            tv.setText("ERROR: " + e.toString());
        }

}




public boolean onCreateOptionsMenu(Menu options) { 
options.add(0, MENU1, 0, "Página Principal");
options.add(0, MENU2, 0, "Manual");
options.add(0, MENU3, 0, "Sobre");

return super.onCreateOptionsMenu(options);   }


public boolean onOptionsItemSelected(MenuItem item) {   
    switch (item.getItemId()) { 
    case MENU1: 
        Intent mudarHome= new Intent(this, MainActivity.class); 
        startActivity(mudarHome);  
        return true;

    case MENU2: 
        Intent mudarManual = new Intent(this, Manual.class); 
        startActivity(mudarManual); 
        return true;

    case MENU3: 
        Intent mudarSobre = new Intent(this, Sobre.class); 
        startActivity(mudarSobre);  
        return true;

        }   
        return false;   
        }
    }
4

3 回答 3

5

这意味着这些参数未找到服务尝试此代码以查找错误消息:

SoapFault error = (SoapFault)envelope.bodyIn;
System.out.println("Error message : "+error.toString());

在我看来,您必须通过包含具有包名称的服务的类来填充 SOAP_ACTION 参数:

private static final String SOAP_ACTION = "http://com.mycompany.wsproj/HelloWorld";

并通过 .wsdl 或 ?wsdl 结束 Web 服务的 URL(尝试它们都 xD )

private static final String URL = "http://localhost:8084/wsproj/HelloWorld?wsdl";

最后一件重要的事情是(当您使用 android API 时)通过 IP 更改 localhost:

private static final String URL = "http://10.0.2.2:8084/wsproj/HelloWorld?wsdl";

希望对你有帮助!!... 祝你好运 !

于 2013-01-02T16:38:10.767 回答
4

当您处理 SOAP Web 服务时,这个问题可能会出现一段时间。来自服务的响应可以是 SOAP 对象,如果出现错误,例如传递了错误的凭据,则响应会带有错误消息,并且它是 SOAPFAULT 对象。因此,请更新您的解析代码以检查响应对象的类型。

这种代码可以解决你的问题,

if (envelope.bodyIn instanceof SoapFault) {
    String str= ((SoapFault) envelope.bodyIn).faultstring;
    Log.i("", str);

    // Another way to travers through the SoapFault object
/*  Node detailsString =str= ((SoapFault) envelope.bodyIn).detail; 
    Element detailElem = (Element) details.getElement(0) 
                 .getChild(0); 
    Element e = (Element) detailElem.getChild(2);faultstring; 
    Log.i("", e.getName() + " " + e.getText(0)str); */
} else {
    SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
    Log.d("WS", String.valueOf(resultsRequestSOAP));
}
于 2013-10-08T19:55:12.630 回答
0

与 Web 服务交互的最佳方式是从 Web 浏览器插入数据并在 android 调试过程之前使用调试器检查它。大多数情况下,它发生在 Web 服务生成异常时。

于 2019-02-27T07:20:13.150 回答