Đối với RPC GWT trên nền tảng Java và Android, Tôi hiện đang thử nghiệm với việc sử dụng gwt-syncproxy để cung cấp Java client access các phương pháp GWT RPC, và tôi đang sử dụng Guice, Gin, và RoboGuice trên nền tảng đích tương ứng của chúng để tiêm các cá thể dịch vụ không đồng bộ thích hợp cho đối tượng Game instantiated.
Trong lõi/pom.xml cho một dự án PlayN, tôi bao gồm các phụ thuộc sau phối để hỗ trợ DI từ Gin/Guice/RoboGuice khi cần thiết:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Sau đó, tôi thêm chú thích @Inject để bất kỳ lĩnh vực bên trong game thực hiện cụ thể:
public class TestGame implements Game {
@Inject
TestServiceAsync _testService;
...
}
trong html/pom.xml, tôi bao gồm các phụ thuộc tọa độ cho Gin:
<dependency>
<groupId>com.google.gwt.inject</groupId>
<artifactId>gin</artifactId>
<version>1.5.0</version>
</dependency>
Và tôi tạo TestGameGinjector và TestGameModule lớp:
TestGameGinjector.java
@GinModules(TestGameModule.class)
public interface TestGameGinjector extends Ginjector {
TestGame getGame();
}
TestGameModule.java
public class TestGameModule extends AbstractGinModule {
@Override
protected void configure() {
}
}
Kể từ lúc này, tôi chỉ tiêm Giao diện TestServiceAsync, tôi không cần phải thực hiện bất kỳ việc thực hiện nào trong phương thức TestGameModule.configure(); Gin quản lý việc khởi tạo AsyncServices cho tôi qua GWT.create().
sau đó tôi thêm vào phần sau đây để TestGame.gwt.xml
<inherits name='com.google.gwt.inject.Inject'/>
Và cuối cùng, tôi đã thực hiện những thay đổi sau đây để 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());
}
}
Và điều này khá nhiều bao gồm nền tảng HTML5 cho PlayN.
Đối với các nền tảng Java, để tôi thêm sự phụ thuộc sau phối để 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>
Do lưu ý rằng các dự án gwt-syncproxy trên Google Code không chứa một pom.xml. Tôi có phiên bản mavenized của gwt-syncproxy được chia nhỏ và khả dụng qua git tại https://bitbucket.org/hatboyzero/gwt-syncproxy.git. Bạn có thể sao chép nó, chạy gói sạch mvn cài đặt để đưa nó vào kho lưu trữ Maven cục bộ của bạn.
Anyways, tôi đã tạo ra một TestGameModule.java cho nền tảng Java như sau:
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"
);
}
}
}
Và tôi sửa đổi TestGameJava.java như sau:
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));
}
}
Tôi đã trải qua một cuộc tập trận tương tự với Nền tảng Android và RoboGuice - mà không đi sâu vào chi tiết, các thay đổi/đoạn mã có liên quan như sau:
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));
}
}
Đó là một tóm tắt nhanh chóng và bẩn thỉu về cách tôi nhận Gin/Guice/RoboGuice + GWT làm việc trong dự án của mình và tôi đã xác minh rằng nó hoạt động trên cả nền tảng Java và HTML đẹp mắt.
Dù sao, có phương pháp GWT để cung cấp các cuộc gọi RPC tới nhiều nền tảng PlayN :).
Không phải là câu trả lời hoàn chỉnh, nhưng một chút: Java hoạt động tốt với Json, nhưng tất cả các thư viện Json tốt đều bị hỏng trong PlayN. Tôi vừa mới đăng câu hỏi ngày hôm nay, bởi vì chúng tôi đang xây dựng máy chủ của mình như một ứng dụng REST không trạng thái bằng cách sử dụng Jersey và một số thứ khác từ ngăn xếp EE. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn Điều này sẽ khuyến khích chúng tôi chia sẻ DTO và có các cuộc gọi lại an toàn và cách sử dụng Sử dụng phương pháp GWT của bạn phá vỡ xây dựng Java, và sau đó bạn chỉ có thể dính vào GWT và sử dụng một số khung làm việc cho nó. – iuiz