这些是我想到的选择:
>使用get()/ post()方法使用JSON for RPC – 编写接受/返回JSON的servlet,并使所有版本的客户端代码都使用.这似乎是可行的,但我担心JSON的冗长度.一旦我得到了心脏的工作,我想继续前进到更复杂的游戏,我担心JSON会导致在客户端和服务器之间来回传递大量的必要信息.我实际上并不知道如何在Java中使用JSON,但我认为这是可行的.我的假设是否在线? Java如何与JSON协同工作?
>继续使用GWT-RPC.我可以通过在我的核心(platform-agnostic)构造函数中使用异步服务接口来实现,而在我的HTML main()中,我传递由GWT.create(MyService.class)生成的GWT Async接口(或至少一个包装器周围).我不知道这对非HTML版本的效果如何.我可以直接从客户端Java代码使用GWT-RPC吗?
>使用其他形式的RPC.有什么建议么?
解决方法
在PlayN项目的核心/ pom.xml中,根据需要,我将包含以下依赖关系坐标来支持Gin / Guice / RoboGuice中的DI:
<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()方法中; Gin通过GWT.create()管理AsyncServices的实例化.
<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平台,我将以下依赖关系坐标添加到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>
请注意,Google Code上的gwt-syncproxy项目不包含pom.xml.我有一个maven版本的gwt-syncproxy分叉,可以通过git在https://bitbucket.org/hatboyzero/gwt-syncproxy.git可用.你应该可以克隆它,运行mvn干包安装,以获取到您的本地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依赖关系
<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,// 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平台上精美地工作.