Hallo,
ich habe hier einen SOAP-Webservice, welchen ich mit einer Android-Anwedung testen möchte.
Dazu habe ich ein Java-Projekt und ein Android-Projekt erstellt.
Als Grundlage habe ich dieses Tutorial benutzt. Ich habe auch Datenbankzugriff über Hibernate, jedoch kommt der erst später hinzu, sobald die Verbindung ohne DB auch funktioniert.
Das Java-Projekt ist eine GWT-Applikation, welche auf einem Tomcat-Server läuft.
Habe im client-Package des Projektes folgende Klasse erstellt:
Die Implementierung auf Serverseite sieht so aus:
Meine web.xml sieht so aus (Ausschnitt):
Habe die Anwendung kompiliert und auf den Server hochgeladen, wenn ich aber mit meiner Anwendung drauf zugreifen möchte, wird folgende Exception geworfen:
Der Android-Code, mit dem ich den WebService nutzen will, sieht so aus:
Weiss jemand, warum das nicht klappt und wie es richtig funktioniert?
ich habe hier einen SOAP-Webservice, welchen ich mit einer Android-Anwedung testen möchte.
Dazu habe ich ein Java-Projekt und ein Android-Projekt erstellt.
Als Grundlage habe ich dieses Tutorial benutzt. Ich habe auch Datenbankzugriff über Hibernate, jedoch kommt der erst später hinzu, sobald die Verbindung ohne DB auch funktioniert.
Das Java-Projekt ist eine GWT-Applikation, welche auf einem Tomcat-Server läuft.
Habe im client-Package des Projektes folgende Klasse erstellt:
Java:
package com.simple.client;
import javax.jws.WebService;
@WebService(name="WebServiceInterface",
targetNamespace="http://simplemaps.com")
public interface MapsWebServiceInterface {
public String getUserInfo(String userName);
public Long register();
}
Die Implementierung auf Serverseite sieht so aus:
Java:
package com.simple.server;
import java.util.ArrayList;
import javax.jws.WebService;
import com.simple.client.MapsWebServiceInterface;
@WebService(serviceName = "MapsServiceHibernate",
portName = "MapsPort",
endpointInterface = "com.simple.client.MapsWebServiceInterface",
targetNamespace = "http://simplemaps.com")
public class MapsWebServiceImpl implements MapsWebServiceInterface{
@Override
public String getUserInfo(String userName) {
return "Test";
}
@Override
public Long register() {
return null;
}
}
Meine web.xml sieht so aus (Ausschnitt):
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>WebService</servlet-name>
<servlet-class>com.simple.server.MapsWebServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebService</servlet-name>
<url-pattern>/service</url-pattern>
</servlet-mapping>
</web-app>
Habe die Anwendung kompiliert und auf den Server hochgeladen, wenn ich aber mit meiner Anwendung drauf zugreifen möchte, wird folgende Exception geworfen:
Code:
java.lang.ClassCastException: com.simple.server.MapsWebServiceImpl cannot be cast to javax.servlet.Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:836)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Der Android-Code, mit dem ich den WebService nutzen will, sieht so aus:
Java:
package com.android.simple;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SimpleMapsWSClient extends Activity {
private static final String NAMESPACE = "http://simplemaps.com";
private static String url = "http://172.18.35.100:8080/simplemaps/service";
private static String methodName = "getUserInfo";
private static final String SOAP_ACTION = "http://simplemaps.com/getUserInfo";
private TextView result;
private EditText searchName;
private Button searchBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
result = (TextView) findViewById(R.id.tx_result);
searchName = (EditText) findViewById(R.id.et_username);
searchBtn = (Button) findViewById(R.id.sf_search);
searchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SoapObject request = new SoapObject(NAMESPACE, methodName);
request.addProperty("arg0", searchName.getText().toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(url);
String res = "";
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultRequestSOAP = (SoapPrimitive) envelope.getResponse();
if(resultRequestSOAP == null) {
res = "Benutzer mit diesem Namen wurde nicht gefunden.";
} else {
res = resultRequestSOAP.toString();
}
} catch(Exception e) {
res = e.getMessage();
} finally {
result.setText(res);
}
}
});
}
}
Weiss jemand, warum das nicht klappt und wie es richtig funktioniert?
Zuletzt bearbeitet von einem Moderator: