[GWT] Probleme beim asynchronen Methodenaufruf mit GWT-RPC

kidsos

Aktives Mitglied
Hallo,

ich arbeite zur Zeit an einer privaten Webanwendung mit dem GWT und bekomme das GWT-RPC nicht so richtig zum Laufen.

Nun, worum gehts genau. Auf der Server-Seite der Anwendung habe ich eine Objektmodell mit JAXB erstellt. Per RPC soll der Client nun eine Methode asynchron aufrufen, damit der Client das zurückgegebene Objekt weiter verarbeiten kann.

Leider wirft mir der GWT-Compiler beim Aufruf immer wieder einen Fehler (siehe Anhang). Da steht zwar, dass ich vielleicht ein "required module" vergessen hätte, aber was muss ich da genau wie machen. Laut dem GWT-Tutorial auf der Google-Seite muss ich der Module-Datei nichts hinzufügen oder verändern.

Wäre super, wenn mir da jemand dabei helfen könnte, das Problem zu lösen!

Die 3 entscheidenden Klassen bzw. Interfaces sehen folgendermaßen aus:
Java:
package de.application.server;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import de.application.client.ApplicationListService;

public class ApplicationListServiceImpl extends RemoteServiceServlet implements
		ApplicationListService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ApplicationList getList() {
		JAXBContext context;
		ApplicationList list = null;
		try {
			context = JAXBContext.newInstance(ApplicationList.class);
			Unmarshaller um = context.createUnmarshaller();
			list = (ApplicationList) um.unmarshal(new FileReader(
					"club-jaxb.xml"));
		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
}
Java:
package de.application.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

import de.application.server.ApplicationList;

public interface ApplicationListServiceAsync {

	void getList(AsyncCallback<ApplicationList> callback);

}
Nach dem Fehler scheint mir das so, dass der die ApplicationList-Klasse vom Server nicht finden kann und daher den Fehler wirft. Muss ich da irgendwo noch eine Referenz hinzufügen?

Java:
package de.application.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

import de.application.server.ApplicationList;

@RemoteServiceRelativePath("appList")
public interface ApplicationListService extends RemoteService {

	ApplicationList getList();
}
 

Anhänge

  • screenshot.jpg
    screenshot.jpg
    39,7 KB · Aufrufe: 49
Zuletzt bearbeitet:

gee_20_4_7

Mitglied
Hi, also du solltest hier mal noch 2 weitere Dateien anbieten:
  • 1. die web.xml, in der du die Services bekannt machst (hier vermute ich, dass da ein Problem vorliegt)
  • 2. die app.gwt.xml, in der du z.B. den Einstiegspunkt bekannt machst. Laut der Fehlermeldung im Anhang scheint mir da auch etwas im Argen.
will mich da aber nicht 100%ig festlegen, deshalb stelle doch mal bitte die beiden Dateien zur Verfügung.
 

kidsos

Aktives Mitglied
Hier noch die 2 entsprechenden Dateien:

Application.gwt.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='application'>
<inherits name='com.google.gwt.user.User'/>

<inherits name="com.google.gwt.http.HTTP" />
<inherits name="com.google.gwt.i18n.I18N" />
<inherits name='com.google.gwt.user.theme.standard.Standard' />
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->

<entry-point class='de.application.client.Application'/>

<source path='client'/>
<source path='shared'/>
</module>
[/XML]

web.xml
[XML]
<?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>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>Application.html</welcome-file>
</welcome-file-list>

<!-- Servlets -->
<servlet>
<servlet-name>appListServiceImpl</servlet-name>
<servlet-class>de.application.server.ApplicationListServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>appListServiceImpl</servlet-name>
<url-pattern>/application/ApplicationListService</url-pattern>
</servlet-mapping>
</web-app>
[/XML]
 

gee_20_4_7

Mitglied
Jetzt stellt sich mir die Frage was ApplikationList ist - eine Liste, die auf beiden Seiten verwendet wird? Was wird in dieser Liste gehalten - vllt ein Typ der auf beiden Seiten benutzt wird? Wenn das der Fall ist, dann leg mal die Klassen in das shared-Paket.

Es ist auf jeden Fall schwer wenn man keinen kompletten Einblick hat. In den beiden XML-Dateien kann ich nichts besonderes erkennen.

Was mich wundert ist, dass du in der ServiceImpl die ApplicationList verwendest - aber nirgendwo ein entsprechender import steht, nee stimmt kommt aus dem Interface...vll wirklich mal die List in das shared paket verschieben. Denn wenn du zur Laufzeit etwas vom Server importierst - ist es de facto nicht verfügbar...
Versuche vllt mal noch den RelativePath deines ApplicationService Interfaces zu überprüfen - also den Wert der Annotation.

Ja leider kann ich hier nur vermuten, aber es hat sich auch in meinen ersten Versuchen gezeigt, dass Klassen, die auf client-, wie auch auf der serverseite verfügbar sein müssen eben in das sharedpaket gehören, was hier evtl der entscheidende Tipp ist.

Sorry für den unkoordinierten Schreibstil, aber ich hatte jetzt nicht so viel Zeit das alles komplett zu überdenken.
 

kidsos

Aktives Mitglied
Also die ApplicationList-Klasse enthält eine Liste von ApplicationItem-Objekten, die ApplicationItem-Klasse wiederum enthält String-Objekte, usw. Hier mal die ApplicationList-Klasse:
Java:
@XmlRootElement(name = "jobApplications")
@XmlAccessorType(XmlAccessType.NONE)
public class ApplicationList {

	private ArrayList<ApplicationItem> itemList;

	public ApplicationList() {
		setList(new ArrayList<ApplicationItem>());
	}

	public void setList(ArrayList<ApplicationItem> itemList) {
		this.itemList = itemList;
	}
	
	@XmlElement(name = "company")
	public ArrayList<ApplicationItem> getList() {
		return itemList;
	}
}

Ja leider kann ich hier nur vermuten, aber es hat sich auch in meinen ersten Versuchen gezeigt, dass Klassen, die auf client-, wie auch auf der serverseite verfügbar sein müssen eben in das sharedpaket gehören, was hier evtl der entscheidende Tipp ist.
Wo ich mir das grad so durch den Kopf gehen lasse, haste eigentlich Recht. Wenn das irgendwann mal alles klappt, sollen ja vom Server ein ApplicationList-Objekt an den Client geschickt werden. Anders rum soll es natürlich auch funktionieren, denn dann kann ich ja ein ApplicationList-Objekt an den Server schicken, der mir dann die passende XML-Datei erstellt. Ist ja Sinn der ganzen Sache. Also die notwendigen Klassen dort rein.

Das Problem ist jetzt allerdings, dass ich mit JAXB eine bestimmte Klassen- und XML-Struktur aufgebaut habe, die in dem shared-Package nicht mehr funktioniert, da die XML-Annotationen nicht aufgelöst werden können. Außerdem hab ich da z.B. ein XMLGregorianCalender-Objekt. Die Klasse gibts ja im GWT nicht.

Wie kann man denn das jetzt lösen?

Ich hab hier ne Anleitung (Teil 1 + Teil 2) gefunden, die vom Prinzip her das macht, was meine Webanwendung später können soll. Allerdings wurde hier mit REST gearbeitet und die XML-Struktur wurde sehr einfach gehalten.
 
Zuletzt bearbeitet:

kidsos

Aktives Mitglied
Das Problem ist jetzt allerdings, dass ich mit JAXB eine bestimmte Klassen- und XML-Struktur aufgebaut habe, die in dem shared-Package nicht mehr funktioniert, da die XML-Annotationen nicht aufgelöst werden können. Außerdem hab ich da z.B. ein XMLGregorianCalender-Objekt. Die Klasse gibts ja im GWT nicht.
Das ich nicht gleich drauf gekommen bin. Lösung des ganzen ist es, die jaxb-impl.jar (aus dem dem lib-Ordner) als Classpath dem Projekt hinzuzufügen. Dadurch können die XML-Annotationen der jeweiligen Klassen im shared-Package aufgelöst werden. Zusätzlich dann noch in den Klassen Serializable implementieren, damit die Objekte auch serialisiert werden können.
Komisch finde ich, dass der Compiler immer noch eine server.gwt.xml verlangt. Hab ich probehalber dort einfach ohne irgendwelchen Schnickschnack erstellt. Scheinbar muss man da nichts besonderes angeben. Die Existenz dieser Datei genügt.

Auf jeden Fall klappt es so! :toll:

Der Compiler wirft nur noch folgende Warnung aus, ansonsten funktioniert es aber:
Code:
[WARN] Server class 'com.sun.xml.bind.v2.ContextFactory' could not be found in the web app, but was found on the system classpath
   [WARN] Adding classpath entry 'file:/C:/jaxb-ri-20091104/lib/jaxb-impl.jar' to the web app classpath for this session
   For additional info see: file:/C:/Users/Chabo/eclipse/plugins/com.google.gwt.eclipse.sdkbundle.2.0.3_2.0.3.v201002191036/gwt-2.0.3/doc/helpInfo/webAppClassPath.html
Wie müsste ich das denn in der web.xml angeben?
 

gee_20_4_7

Mitglied
Das sieht mir so aus, dass die jaxb-impl.jar nicht im lib-Verzeichnis gefunden werden kann...versuchs mal mit einem copy & paste in dieses verzeichnis... war/webinf/lib/
mehr kann ich dir an dieser Stelle auch nicht raten...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JSF Probleme beim redirect im ExceptionHandler Web Tier 2
D Probleme beim installieren von WebBeans Web Tier 2
H Probleme beim Aufrufen von Java- oder Servlet-Methoden aus Javascript Web Tier 2
pkm Probleme mit einem AJAX-Call in einem dynamischen Webprojekt Web Tier 15
M JSF Probleme bei Navigation mit Verzeichnisswechsel Web Tier 2
W JSF Probleme mit Data Table Web Tier 8
W JSF Probleme mit Zugriff zur Managed Bean Web Tier 11
G Probleme mit Java + Tomcat | Cannot switch on a value of type String for source level below 1.7 Web Tier 8
F JSF Probleme mit OverlayPanel Web Tier 0
H Frameset durch Tabelle ersetzten - Probleme mit jsp:include Web Tier 3
xehpuk JSF URL-Encoding-Probleme bei <h:link> (Mojarra) Web Tier 4
M ejb @Remote macht probleme Web Tier 10
S JSF SelectOneMenu - Probleme mit AJAX Web Tier 6
W Probleme mit Expression language ? Web Tier 13
P JSF Datenbank Probleme (Limit, Wiederholung) Web Tier 8
J JSF JavaScript Probleme zwischen Tomahawk und Tiles!? Web Tier 2
B Probleme mit h:selectOneRadio Web Tier 2
T DWR - Probleme mit Konfiguration Web Tier 13
W JSF MyFaces Tomahawk Probleme Web Tier 4
G Probleme mit EclipseLink und Java.util.Date Web Tier 3
P JSF 1.2 Navigation probleme Web Tier 2
D Probleme mit Tomcat Web Tier 3
M Tomcat 6 Umlaut Probleme Web Tier 2
D Seam Example Probleme Web Tier 2
C Probleme mit JSPs in Unterverzeichnissen Web Tier 4
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
0 JSF: css einbinden - Probleme Web Tier 2
M iframe probleme Web Tier 2
B Probleme mit RichFaces Web Tier 2
O struts2 - Probleme mit parametrisierten URLs Web Tier 5
E Probleme mit GWT & MySQL Web Tier 3
G Probleme mit Ajax Login (jsp) Web Tier 5
S Tomcat / Eclipse Probleme Web Tier 2
B Probleme mit <jsp:include page=""/> und Laufzeit Web Tier 7
P Zurück-Button des Browsers macht Probleme Web Tier 9
O Struts2: Probleme mit Links aus Packages raus Web Tier 9
A JSF+Glassfish: Probleme mit Managed Bean Web Tier 2
S Probleme mit den Nav_rules und HTML code Web Tier 2
D Probleme mit ServletRequest Web Tier 14
G Probleme mit Tomcat Web Tier 14
E RichFaces 3.2.1 Probleme Web Tier 4
W JSTL macht Probleme Web Tier 6
W JavaBeans class="" macht Probleme Web Tier 2
A Time-Out Probleme Web Tier 21
B Probleme mit Marquee Tag Web Tier 3
pkm Problem beim Import eines dynamischen Webprojekts als .zip Web Tier 2
Rudolf Glassfish stoppen beim Start ALLE Applikationen zu deployen Web Tier 3
T JSF Primefaces beim öffnen eines p:dialog wird eine neue View ManagedBean erstellt Web Tier 2
M Exception beim Erstellen einer Query Web Tier 9
M JSP Problem beim deployen auf Tomcat Web Tier 2
H JSP Class not found beim Applet-Start Web Tier 4
B JSP Warning [unchecked] beim Build von JSP Web Tier 5
I Beim zurück-Link wird immer ein Request ausgeführt Web Tier 5
Spin JSP Fehler beim casten , why? Web Tier 6
R Fehler 1053 beim Beenden von Tomcat Web Tier 25
A Tomcat: beim Start des Servers einmalige Aktion aufrufen (Problem gelöst) Web Tier 2
F Fehler beim erstellen des EJB - Moduls! Web Tier 4
F Beim Aufruf von einer JSF Seite eine Methode ausführen Web Tier 9

Ähnliche Java Themen

Neue Themen


Oben