Probleme, die Klassenobjekte über GWT RPC übergeben
Ich habe durch das Google Web Toolkit StockWatcher Tutorial mit Eclipse und die Google-Pluginund ich bin versucht, einige grundlegende änderungen auf, so dass ich besser verstehen können, die RPC-framework.
Habe ich geändert, die "getStocks" - Methode auf die StockServiceImpl server-side-Klasse, so dass es gibt ein array von Lager-Objekte anstelle von String-Objekten. Die Anwendung kompiliert einwandfrei, aber die Google-Web-Toolkit ist wieder die folgende Fehlermeldung:
"Keine source-code ist verfügbar für Typ com.google.gwt.Probe.stockwatcher.server.Lager; hast du vergessen, zu Erben ein erforderliches Modul?"
Google Web Toolkit-Hosted-Modus http://i44.tinypic.com/a47r83.jpg
Scheint es, dass die client-side-Klassen nicht finden können, eine Implementierung der Lager-Objekt, auch wenn die Klasse importiert wurde. Als Referenz, hier ist ein screenshot von meinem Paket-Hierarchie:
Eclipse-Package-Hierarchie http://i43.tinypic.com/14tr5gk.jpg
Ich vermute, dass ich etwas fehlt in web.xml, aber ich habe keine Ahnung, was es ist. Kann jemand mich in die richtige Richtung?
EDIT: Vergessen zu erwähnen, dass die Stock-Klasse ist beständige, so muss es bleiben, die auf der server-Seite.
InformationsquelleAutor der Frage Templar | 2009-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel Versuch und Irrtum, ich habe es geschafft einen Weg zu finden, dies zu tun. Es ist vielleicht nicht der beste Weg, aber es funktioniert. Hoffentlich wird dieser post sparen können, jemand der viel Zeit und Mühe.
Diese Anweisungen gehen davon aus, dass Sie abgeschlossen haben, sowohl die basic StockWatcher tutorial und die Google App Engine StockWatcher änderungen.
Erstellen Sie eine Client-Seitige Implementierung der Stock-Klasse
Gibt es ein paar Dinge zu beachten, über GWT:
Sowohl wegen der oben genannten Punkte, kann der client nie umsetzen der Stock-Klasse, die wir geschaffen haben in com.google.gwt.Probe.stockwatcher.server. Stattdessen erstellen wir eine neue client-side-Stock-Klasse genannt, StockClient.
StockClient.java:
Ändern der Client-Klassen zu Verwenden, StockClient[] statt String[]
Nun machen wir einige einfache änderungen an der client-Klassen, so dass Sie wissen, dass die RPC-Aufruf zurückgegeben StockClient[] statt String[].
StockService.java:
StockServiceAsync.java:
StockWatcher.java:
Hinzufügen eines importieren:
Alle anderen code bleibt der selbe, außer addStock, loadStocks, und displayStocks:
Ändern Sie die StockServiceImpl Klasse Zurück StockClient[]
Schließlich ändern wir die getStocks Methode der StockServiceImpl Klasse, so dass es übersetzt der server-Seite-Lager-Klassen in client-side StockClient Klassen vor der Rückgabe des array.
StockServiceImpl.java
Müssen wir ändern addStock Methode leicht an, so dass die erzeugte ID wird zurückgegeben:
Alle anderen Methoden bleiben die gleichen, außer getStocks:
Zusammenfassung
Den code oben funktioniert perfekt für mich wenn Sie eingesetzt werden, Google App Engine, aber es wird ein Fehler in der Google-Web-Toolkit-Hosted-Modus:
Lassen Sie mich wissen, wenn Sie stoßen das gleiche problem oder nicht. Die Tatsache, dass es funktioniert in Google App Engine scheint ein bug im Hosted-Modus.
InformationsquelleAutor der Antwort Templar
GWT braucht .java-Datei zusätzlich zu den .Klasse Datei. Darüber hinaus Bestand muss in der "client" - Position ein GWT-Modul.
InformationsquelleAutor der Antwort Steve Reed
Den GWT-compiler nicht weiß, über Stock, weil es nicht an einem Ort sieht es. Sie können entweder verschieben Sie es an den client-Ordner, oder ob es mehr Sinn macht dort lassen, wo es ist, und erstellen Sie eine ModuleName.gwt.xml verweist alle anderen Klassen, die Sie wollen, und bekommen Ihre Main.gwt.xml Datei Erben.
zB: DomainGwt.gwt.xml
und:
InformationsquelleAutor der Antwort rustyshelf
Gibt es eine bessere Antwort hier: GWT Einfache RPC-use-case-problem : Code enthalten
Grundsätzlich können Sie Parameter hinzufügen, um Ihre APPNAME.gwt.xml Datei, damit der compiler zu geben, die der compiler einen Pfad zu den server-side-Klasse.
InformationsquelleAutor der Antwort Tim
War ich immer das gleiche Problem und die "mvn gwt:compile" - Ausgabe war nicht sehr hilfreich.
Stattdessen, wenn ich versuchte, bereitstellen von tomcat (über das maven-tomcat-plugin: mvn tomcat:deploy) bekam ich hilfreiche Fehlermeldungen.
Ein paar Dinge, die ich hatte, zu reparieren:
InformationsquelleAutor der Antwort jasop
Ja, es ist sicher, dass wir verwenden müssen, um die Serialisierung für das abrufen der server-Objekte an den client. Diese modile?? die Einstellungen in der Datei wird nicht funktionieren, verwenden Sie die Stock-Klasse in der client-Seite.
In Ihrem Fall haben Sie nur eine Klasse Lager und Sie können ein StockClient im client-Seite. Es ist ganz einfach. Aber was wird die Lösung sein, wenn jemand mit mehr Klassen. So etwas wie die Eigenschaften dieser Klasse werden auch einige andere Art von Klassen.
Beispiel:
stock.getEOD(date).getHigh();
getEOD
zurückkehren wird eine weitere Klasse mit dem angegebenen Datum und Klasse hat diegetHigh
Methode.Was zu tun ist in solchen großen Fällen? Ich glaube nicht, dass die Erstellung aller Klassen der Umsetzung der Serialisierung in der client-Seite ist gut. Dann haben wir code schreiben, der in server und client. alle Klassen zwei mal.
InformationsquelleAutor der Antwort
Keying aus der rustyshelf Antwort oben ...
In meinem Fall brauchte ich zum Bearbeiten der ModuleName.gwt.xml Datei und fügen Sie die folgenden:
Ich habe mein Projekt mit dem New->Web Application Projekt - Assistenten, aber nicht markiert Generierung der Projekt-sample-code option. Dann habe ich das shared Paket. Hatte ich nicht deaktiviert, würde das Paket wurde für mich geschaffen und die xml-Datei modifiziert gemäß der obigen.
InformationsquelleAutor der Antwort Bob Dillon
Gibt es eine weit mehr einfache und einfache Lösung. Wenn Sie ein Objekt senden möchten, der Ihre kundenspezifische Klasse von server-Seite auf der client-Seite sollten Sie definieren diese benutzerdefinierte Klasse in gemeinsamen Paket.
Beispielsweise für Ihren Fall, den Sie gerade haben zu tragen die Stock.java Klasse (drag und drop) in
Paket. Aber aus Ihrem Paket-Hierarchie (screenshot) es scheint, dass Sie gelöscht hatte dieses gemeinsame Paket. Nur re-dieses Paket erstellen und drop die Stock.java innen und lass das Spiel beginnen.
InformationsquelleAutor der Antwort ali kerim erkan