對於Java和Android平臺上的GWT RPC,我目前正在嘗試使用gwt-syncproxy爲GWT RPC方法提供Java客戶端訪問,並且我正在使用Guice,杜松子酒和RoboGuice他們各自的目標平臺爲實例化的Game對象注入適當的異步服務實例。
在一個PlayN項目的核心/ pom.xml中,我包括以下依賴座標作爲需要從GIN /吉斯/ RoboGuice支持DI:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
然後,添加@Inject註釋任何領域具體實施遊戲裏面:
public class TestGame implements Game {
@Inject
TestServiceAsync _testService;
...
}
在HTML/pom.xml中,我包括杜松子酒的依賴座標:
<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()方法中放置任何實現;杜松子酒通過GWT.create()爲我管理AsyncServices的實例化。
我加入以下到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());
}
}
而且這幾乎涵蓋了PlayN的HTML5平臺。
對於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項目不包含一個pom.xml。我有一個mavenized版本的gwt-syncproxy分叉和可通過git在https://bitbucket.org/hatboyzero/gwt-syncproxy.git。您應該可以克隆它,運行mvn clean package install以將其導入您的本地Maven存儲庫。
不管怎麼說,我創建了Java平臺的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"
);
}
}
}
而且我修改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 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));
}
}
這是一個如何在我的項目中獲得Gin/Guice/RoboGuice + GWT的快速和骯髒的破壞,並且我已經驗證它可以在Java和HTML平臺上很好地工作。
無論如何,有GWT的方法來提供RPC呼叫到多個PlayN平臺:)。
不是一個完整的答案,但有一點:Java與Json很好地協作,但所有好的Json庫在PlayN下都被破壞了。我今天剛剛發佈了一個問題,因爲我們正在使用Jersey和EE堆棧中的其他一些東西將我們的服務器構建爲無狀態的REST應用程序。 http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn 這eneables我們分享的DTO,並有類型安全的回調和投射 使用您的GWT方法可能打破Java構建,然後你可以堅持到GWT,並使用一些畫布框架。 – iuiz 2012-01-28 17:11:07