Para la RPC GWT en las plataformas Java y Android, actualmente estoy experimentando con el uso de GWT-syncproxy para proporcionar acceso de cliente de Java para los métodos de GWT RPC, y estoy usando Guice, Gin, y en RoboGuice sus respectivas plataformas de destino para inyectar las instancias de servicio asíncronas apropiadas para el objeto de juego instanciado.
En el núcleo/pom.xml para un proyecto reproducirN, incluyo la siguiente dependencia coordenadas para apoyar DI de Gin/Guice/RoboGuice según sea necesario:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Luego añadir anotaciones a cualquier campo @Inject en el interior del hormigón aplicación del juego:
public class TestGame implements Game {
@Inject
TestServiceAsync _testService;
...
}
En el html/pom.xml, incluyo la dependencia coordenadas de Gin:
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>1.5.0</version>
</dependency>
Y creo TestGameGinjector y TestGameModule clases:
TestGameGinjector.java
@GinModules(TestGameModule.class)
public interface TestGameGinjector extends Ginjector {
TestGame getGame();
}
TestGameModule.java
public class TestGameModule extends AbstractGinModule {
@Override
protected void configure() {
}
}
Dado que por el momento, sólo estoy inyectando el Interfaz TestServiceAsync, no necesito poner ninguna implementación en el método TestGameModule.configure(); Gin gestiona la creación de instancias de AsyncServices para mí a través de GWT.create().
Luego añade lo siguiente a TestGame.gwt.xml
<inherits name='com.google.gwt.inject.Inject'/>
Y finalmente, realizado los siguientes cambios a 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());
}
}
Y esto cubre prácticamente la plataforma HTML5 para PlayN.
para la plataforma Java, añado la siguiente dependencia coordina a 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>
tenga en cuenta que el proyecto GWT-syncproxy en Google Code no contiene un pom.xml. Tengo una mavenized versión de gwt-syncproxy bifurcada y disponible a través de git en https://bitbucket.org/hatboyzero/gwt-syncproxy.git. Debería poder clonarlo, ejecutar mvn limpiar instalar paquete para obtenerlo en su repositorio local de Maven.
De todas formas, he creado un TestGameModule.java para la plataforma Java de la siguiente manera:
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"
);
}
}
}
Y he modificado TestGameJava.java de la siguiente manera:
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));
}
}
Fui a través de un ejercicio similar con el Plataforma Android y RoboGuice: sin entrar en detalles, los cambios/fragmentos relevantes son los siguientes:
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
public class TestGameActivity extends GameActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
final Injector injector = ((RoboApplication) getApplication()).getInjector();
injector.injectMembers(this);
super.onCreate(savedInstanceState);
}
@Override
public void main(){
platform().assetManager().setPathPrefix("test/images");
final Injector injector = ((RoboApplication) getApplication()).getInjector();
PlayN.run(injector.getInstance(TestGame.class));
}
}
Ese es un resumen rápido y sucio de cómo obtuve Gin/Guice/RoboGuice + GWT trabajando en mi proyecto, y he verificado que funciona tanto en plataformas Java como en HTML.
De todos modos, existe el enfoque GWT para proporcionar llamadas RPC a múltiples plataformas PlayN :).
No es una respuesta completa, pero un poco: Java funciona bien con Json, pero todas las buenas libs de Json están rotas bajo PlayN. Acabo de publicar una pregunta hoy, porque estamos construyendo nuestro servidor como una aplicación REST sin estado usando Jersey y algunas otras cosas de la pila EE. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn Esto nos permite compartir DTO y tener callbacks y yesos de tipo seguro Usando su método GWT podría rompa la compilación de Java, y luego podría apegarse a GWT y utilizar un marco de lienzo para ello. – iuiz