2012-10-28 26 views
3

我想从Android客户端访问Java Web服务,但它显示了我的错误:的Android - org.ksoap2.soapfault无法施展

“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; 
     } 
    } 
+0

在什么行是异常发生?您可以通过在调试器中运行您的应用程序并查看异常详细信息来找到它。 –

+0

当我尝试运行调试器时,应用程序打开显示我“等待调试器 - 强制关闭”。 – JulToldo

回答

4

这意味着没有通过这些参数发现服务尝试这个代码,找出错误消息:

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(都去尝试一下XD)

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

最后一个重要的事情是结束Web服务的URL(当您使用的Android API)由IP改变本地主机:

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

希望能帮到你! ... 祝你好运 !

+0

谢谢你的回复也帮助了我;-) –

4

当您处理SOAP Web服务时,可能会出现此问题一段时间。来自该服务的响应可以是SOAP对象,如果出现错误,如错误凭据传递,则Response将带有错误消息,并且它是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)); 
} 
+0

谢谢:-)帮了我很多。 – user1007522

相关问题