# Kann Klasse nicht zu Servlet casten



## Fabulus (21. Jun 2012)

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:


```
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:

```
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):


```
<?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:


```
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:

```
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?


----------



## SlaterB (21. Jun 2012)

die Klassen aus dem Tutorial gehen wohl auch nicht?
lieber die soweit wie möglich, evtl. mit Dummy-Inhalt statt DB-Zugriff, nutzen, statt eigene Klassen

Suche
@WebService "cannot be cast to javax.servlet.Servlet"

liefert u.a.
web services - ClassCastException in Annotated WebService in JBoss & Java 6 - Stack Overflow

hast du einen zu alten WebServer? @WebService ist ja bisschen was anderes als das klassische Handwerks-J2EE,
wo jedes Servlet auch wirklich noch ein Servlet war..,
evtl. die Suche noch auf Tomcat ausweiten, wenn du nicht bei JBoss bist


----------



## Fabulus (21. Jun 2012)

Ich hab das Tutorial ja quasi abgetippt, ich wüsste nicht, wo da ein Unterschied sein soll..
Mein Webserver ist ein Apache Tomcat 7, läuft hier übern XAMPP... Weiss nicht, ob der zu alt ist..


----------



## SlaterB (21. Jun 2012)

> Ich hab das Tutorial ja quasi abgetippt, ich wüsste nicht, wo da ein Unterschied sein soll..
jeder einzelne Tipp kann fehl gehen, mit genau den Tutorial-Klassen, deren Namen in Konfigurationen usw.
schließt du viele Möglichkeiten aus, selbst wenn du manchen Methodeninhalt ändern solltest,
na egal

hast du überhaupt je gehört, gelesen, gesehen, dass auf einem Tomcat 7 ein WebService laufen kann?
evtl. zusätzliche Plugins/ Konfigurationen nötig? vom installierten Java abhängig?
(edit: http://www.java-forum.org/soa/115515-jax-ws-webservice-tomcat-7-a.html )

dein Tutorial scheint 'Websphere Application Server Community Edition 2.1.1 (WASCE)' zu empfehlen, was immer das sein mag

hier
Re: deploying a war file and starting the application
lese ich


> What web service container are you trying to use? You mentioned earlier
> in the thread that WebSphere and WebLogic servers were working well.
> Perhaps that's because they provide their own web service containers
> while Tomcat does not?



sicheres dazu kann ich nicht sagen, aber vielleicht versuchst du zumindest mal JBoss, der sollte frei und verbreitet sein
(vor paar edits oben, scheint auch für Tomcat was zu geben)


----------



## Spacerat (21. Jun 2012)

Hm... ich kenne die WebService-Annotation zwar nicht, aber ich denke mal nicht, das dadurch automatisch "javax.servlet.Servlet" erweitert wird. Kurz gesagt, dein Interface erweitert Servlet nicht und deshalb kann es auch nicht gecastet werden.


----------



## SlaterB (21. Jun 2012)

im Tutorial nicht der Fall, das würde ich nicht soviel vermuten


----------

