Per la RPC GWT sulle piattaforme Java e Android, attualmente sto sperimentando con l'utilizzo di GWT-syncproxy per fornire l'accesso client Java per i metodi di GWT RPC, e sto usando Guice, Gin, e RoboGuice su le rispettive piattaforme di destinazione per iniettare le istanze del servizio asincrono appropriate per l'oggetto Game istanziato.
Nel nucleo/pom.xml per un progetto visualizzarloN, che includono i seguenti dipendenza coordinate per sostenere DI Gin/Guice/RoboGuice come necessario:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Poi aggiungere annotazioni @Inject nessun campo all'interno della realizzazione concreta di gioco:
public class TestGame implements Game {
@Inject
TestServiceAsync _testService;
...
}
nel codice HTML/pom.xml, includo coordina la dipendenza per Gin:
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>1.5.0</version>
</dependency>
E creo TestGameGinjector e TestGameModule classi:
TestGameGinjector.java
@GinModules(TestGameModule.class)
public interface TestGameGinjector extends Ginjector {
TestGame getGame();
}
TestGameModule.java
public class TestGameModule extends AbstractGinModule {
@Override
protected void configure() {
}
}
Poiché in questo momento, sto solo iniettare il Interfaccia TestServiceAsync, non ho bisogno di mettere alcuna implementazione nel metodo TestGameModule.configure(); Gin gestisce l'istanza di AsyncServices per me tramite GWT.create().
Ho poi aggiunto il testo seguente TestGame.gwt.xml
<inherits name='com.google.gwt.inject.Inject'/>
E, infine, ho apportato le seguenti modifiche al TestGameHtml.java
public class TestGameHtml extends HtmlGame {
private final TestGameGinjector _injector = GWT.create(TestGameGinjector.class);
@Override
public void start() {
HtmlPlatform platform = HtmlPlatform.register();
platform.assetManager().setPathPrefix("test/");
PlayN.run(_injector.getGame());
}
}
E questo copre praticamente la piattaforma HTML5 per visualizzarloN.
per la piattaforma Java, aggiungo il seguente dipendenza coordinate per java/pom.xml:
<dependency>
<groupId>com.gdevelop.gwt.syncrpc</groupId>
<artifactId>gwt-syncproxy</artifactId>
<version>0.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0-rc2</version>
</dependency>
notano che il progetto GWT-syncproxy su Google Code non contiene un pom.xml. Ho una versione di gwt-syncproxy forked e disponibile tramite git a https://bitbucket.org/hatboyzero/gwt-syncproxy.git. Dovresti essere in grado di clonarlo, eseguire mvn clean package install per scaricarlo nel tuo repository Maven locale.
In ogni modo, ho creato un TestGameModule.java per la piattaforma Java come segue:
public class TestGameModule extends AbstractModule {
@Override
protected void configure() {
bind(TestServiceAsync.class).toProvider(TestServiceProvider.class);
}
public static class TestServiceProvider implements Provider<TestServiceAsync> {
public TestServiceAsync get() {
return (TestServiceAsync) SyncProxy.newProxyInstance(
TestServiceAsync.class,
Deployment.gwtWebPath(), // URL to webapp -- http://127.0.0.1:8888/testgame
"test"
);
}
}
}
E ho modificato TestGameJava.java come segue:
public class TestGameJava {
public static void main(String[] args) {
Injector _injector = Guice.createInjector(new TestGameModule());
JavaPlatform platform = JavaPlatform.register();
platform.assetManager().setPathPrefix("test/images");
PlayN.run(_injector.getInstance(TestGame.class));
}
}
ho attraversato un esercizio simile con la Piattaforma Android e RoboGuice - senza entrare nel dettaglio, le modifiche/snippet rilevanti sono le seguenti:
pom.xml d ependencies
<dependency>
<groupId>com.gdevelop.gwt.syncrpc</groupId>
<artifactId>gwt-syncproxy</artifactId>
<version>0.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.roboguice</groupId>
<artifactId>roboguice</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0-rc2</version>
<classifier>no_aop</classifier>
</dependency>
TestGameApplication.java
public class TestGameApplication extends RoboApplication {
@Override
protected void addApplicationModules(List<Module> modules) {
modules.add(new TestGameModule());
}
}
TestGameModule.java
public class TestGameModule extends AbstractModule {
@Override
protected void configure() {
bind(TestServiceAsync.class).toProvider(TestServiceProvider.class);
}
public static class TestServiceProvider implements Provider<TestServiceAsync> {
public TestServiceAsync get() {
return (TestServiceAsync) SyncProxy.newProxyInstance(
TestServiceAsync.class,
Deployment.gwtWebPath(), // URL to webapp -- http://127.0.0.1:8888/testgame
"test"
);
}
}
}
TestGameActivity.java
Questa è una sintesi rapida e sporca di come ho fatto funzionare Gin/Guice/RoboGuice + GWT nel mio progetto, e ho verificato che funzioni su entrambe le piattaforme Java e HTML in modo bello.
Ad ogni modo, c'è l'approccio GWT per fornire chiamate RPC a più piattaforme PlayN :).
Non una risposta completa, ma un po ': Java funziona bene con Json, ma tutte le buone librerie Json sono interrotte sotto PlayN. Ho appena postato una domanda oggi, perché stiamo costruendo il nostro server come applicazione REST stateless usando Jersey e altre cose dallo stack EE. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn Questo ci consente di condividere DTO e avere callback e cast di tipo utilizzando il tuo metodo GWT spezza la build di Java, quindi puoi semplicemente limitarti a GWT e utilizzare un framework canvas per questo. – iuiz