我正在尝试从Android客户端访问Java Web服务,但它显示错误:
“java.lang.classcastexception org.ksoap2.soapfault无法强制转换为org.ksoap2.serialization.soapobject”
你能帮助我吗?
这是我的客户端网络服务代码:
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 :(得分: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";
希望能帮到你!!祝你好运!
答案 1 :(得分: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));
}
答案 2 :(得分:0)
与Web服务进行交互的最佳方法就是插入数据 从网络浏览器中查看,并在Android调试过程之前与调试器进行检查。通常发生在 Web服务会生成异常。