Probleme mit GWT und JAXB

kidsos

Grünschnabel
Hallo,

ich habe zur Zeit das selbe Problem, naja fast ;)

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

Also, 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:
Code:
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;
	}
}
Code:
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?

Code:
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.PNG
    screenshot.PNG
    19,9 KB · Aufrufe: 53
Zuletzt bearbeitet:

kidsos

Grünschnabel
Für diejenigen, die es interessiert: ich habs mit ein bisschen Hilfe hinbekommen.

Nun, wie hab ich's gemacht?

Die 3 obigen Klassen bzw. Interfaces für die Kommunikation zwischen Client und Servers habe ich so belassen wie sie sind. Entscheidend ist, wo die Klassenstruktur mit den XML-Annotationen liegt. Diese gehört nämlich in das shared-Package des GWT-Projekts, da ja Client als auch Server die Klassenstruktur kennen müssen. Nun hatte ich aber in dem shared-Package das Problem, dass die XML-Annotationen nicht aufgelöst werden konnten. Also hab ich die JAXB Sources (hier die jaxb-impl.jar importieren) dem Klassenpfad hinzugefügt. Der Vollständigkeit halber musste ich in dem Server-Teil des Projekt noch eine Module-File anlegen (mehr hab ich hier nicht getan). Wozu das genau gut ist, weiß ich auch nicht. Jedenfalls funktioniert es so. Für den letzten Feinschliff habe ich dann noch die "jaxb-impl.jar" in den "war/WEB-INF/lib"-Ordner kopiert.

Fazit: XML-Handling ist auf die Server-Seite gewandert und nun wesentlich einfacher zu handhaben. Außerdem muss ich mich nicht mehr mit NodeList, Node, usw rumplagen. Das übernimmt für mich JAXB.

Vielleicht hilft dem einen oder anderen diese Anleitung. Ich kann damit endlich die nächste Stufe meines Projekts in Angriff nehmen.
 

IcocaI

Mitglied
huhu,

ich habs total vergessen, hier nochmal meine lösung vorzustellen ... werds aber heute abend nochmal versuchen :/ ...
bin jetzt auch schon soweit, xmldateien zu erstellen. aber wenn ich eine datei empfangen möchte ( bis jetzt hab ich nur manuell hinbekommen ) muss ich jedes einzelne jaxbelementattribut in eine javaklassenattribut umwandeln :/ und das per hand XO ...

auch wenn mans alleine herausgekriegt hat, geht dabei immer viel zeit drau :/
 

pepe4ever

Grünschnabel
Hallo,

ich arbeite grade an einem SmartGwt - Anwendung und möchte etwas in XML schreiben und später die Daten auslesen.

Ich habs mir überlagt JAXB dazu verwenden, jedoch ich weiß jetzt nicht genau wie soll ich die Dateien auf client, server und shared verteilen.

Erstmal hab ich alle Dateien (ObjectFactory.java, XmlReader.java und die von xjc erzeugten Dateien) in shared package.

Aber so bekomme ich ein Fehlermeldung
Code:
[DEBUG] [jaxbtestennew] - Validating newly compiled units
	[ERROR] [jaxbtestennew] - Errors in 'file:/D:/workspace/jaxbTestenNew/src/test/shared/XmlReader.java'
		[ERROR] [jaxbtestennew] - Line 28: No source code is available for type javax.xml.bind.JAXBContext; did you forget to inherit a required module?
		[ERROR] [jaxbtestennew] - Line 33: No source code is available for type javax.xml.bind.Unmarshaller; did you forget to inherit a required module?
		[ERROR] [jaxbtestennew] - Line 34: No source code is available for type java.io.File; did you forget to inherit a required module?
		[ERROR] [jaxbtestennew] - Line 48: No source code is available for type javax.xml.bind.Marshaller; did you forget to inherit a required module?
		[ERROR] [jaxbtestennew] - Line 72: No source code is available for type javax.xml.bind.JAXBException; did you forget to inherit a required module?
Ich würde auch gerne wissen wie sol lich die Methoden von meinem XmlReader später aufrufen****

Geht das einfach bspw mit
XmlReader.methode();
 

IcocaI

Mitglied
Hey,

das mit dem Client/Server habe ich auf Anhieb auch nicht verstanden. Aber eigentlich ist es recht einfach.

Auf der Clientseite hast du alles nötige, was GWT, GWT-Smart, Ext-GWT, etc. verwenden kann. Die verwendeten Bibliotheken findest du im Netz. Es können ausschließlich nur die Sachen verwendet werden, die von GWT freigegeben sind. Alles was auf der Clientseite steht, wird nachher umgewandelt in Java Script, HTML, etc..

Auf der Serverseite kannst du andere Bibliotheken benutzen, die du auf der Clientseite nicht benutzen kannst/darfst.

Um jetzt vom Client zum Server Daten zu übertragen werden Interfaces erstellt.

JAXB ist echt klasse, wenn es darum geht, vorhandene XSDs (deren Struktur einfach zu groß sind um diese manuell einzupflegen) zu benutzen, um danach die JAXB-Klassen zu generieren.

Meine Lösung:
Ich habe ein Container auf der Clientseite, dass alle oder fast alle Attribute die in XML umgewandelt werden sollen, geschrieben. Diese werden dann einzeln (oder Array, Liste, Objekt) mit der Schnittstelle zwischen Client und Server verbunden. Ist nun auch für die Serverseite so weit alles erledigt, dass man auf die Attribute zugreifen kann, muss man diese letztendlich mit den dazugehörigen JAXB-Klassen deren Attribute verknüpfen.


Shared habe ich nicht verwendet, wozu auch.

Zumindest bekommst du diese Fehlermeldung nicht mehr, weil jede Seite nun das kann, wofür es eigentlich ausgerichtet ist.
 

Neue Beiträge