Для GWT RPC на платформах Java и Android в настоящее время я экспериментирую с использованием gwt-syncproxy для предоставления Java-клиенту доступа к методам GWT RPC, а также использую Guice, Gin и RoboGuice для соответствующих целей. платформы для внедрения соответствующих экземпляров асинхронных служб для созданного объекта Game.
В core / pom.xml для проекта PlayN я включаю следующие координаты зависимостей для поддержки DI из Gin / Guice / RoboGuice по мере необходимости:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Затем я добавляю аннотации @Inject к любым полям внутри конкретной реализации Game:
public class TestGame implements Game {
@Inject
TestServiceAsync _testService;
...
}
В html / pom.xml я включаю координаты зависимости для Gin:
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>1.5.0</version>
</dependency>
И я создаю классы TestGameGinjector и TestGameModule:
TestGameGinjector.java
@GinModules(TestGameModule.class)
public interface TestGameGinjector extends Ginjector {
TestGame getGame();
}
TestGameModule.java
public class TestGameModule extends AbstractGinModule {
@Override
protected void configure() {
}
}
Поскольку на данный момент я только внедряю интерфейс TestServiceAsync, мне не нужно помещать какую-либо реализацию в метод TestGameModule.configure (); Джин управляет созданием AsyncServices для меня через GWT.create ().
Затем я добавил следующее в TestGame.gwt.xml
<inherits name='com.google.gwt.inject.Inject'/>
И, наконец, я внес следующие изменения в 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());
}
}
И это в значительной степени охватывает платформу HTML5 для PlayN.
Для платформы Java я добавляю следующие координаты зависимостей в 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>
Обратите внимание, что проект gwt-syncproxy в Google Code не содержит pom.xml. У меня есть mavenized версия gwt-syncproxy, разветвленная и доступная через git по адресу https://bitbucket.org/hatboyzero/gwt-syncproxy.git.. Вы сможете ее клонировать, запустите mvn clean package install , чтобы получить ее в ваш местный репозиторий Maven.
В любом случае, я создал TestGameModule.java для платформы 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"
);
}
}
}
И я изменил TestGameJava.java следующим образом:
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));
}
}
Я прошел аналогичное упражнение с платформой Android и RoboGuice - не вдаваясь в огромные детали, соответствующие изменения / фрагменты выглядят следующим образом:
зависимости pom.xml
<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));
}
}
Это краткое и грязное изложение того, как я запустил Gin / Guice / RoboGuice + GWT в моем проекте, и я убедился, что он прекрасно работает на платформах Java и HTML.
В любом случае, существует подход GWT для предоставления вызовов RPC на несколько платформ PlayN:).