为什么GWTRPC *服务接口类使用“.client”包而不是“.shared”?

时间:2011-08-27 19:13:25

标签: gwt gwt-rpc

查看GWT示例应用程序和RPC tutorial使用以下程序包约定:

./client/GreetingService.java
./client/GreetingServiceAsync.java
./server/GreetingServiceImpl.java

虽然GWT文档在最佳实践上非常稀疏,但在运行时将哪些组件包含在内,明确的直觉是:

  • client - 由GWT编译器编译成JavaScript
  • server - 由javac
  • 编译成字节码
  • shared - 由GWT编译器编译成JavaScript 由javac编译成字节码

这会让人相信client中的代码应该在javac的编译时源路径上。但是,由于GreetingServiceImpl实现了GreetingService,所以client中的代码显然需要在编译期间位于源路径上,并且在部署时包含在运行时类路径中。

鉴于此,为什么GreetingService界面不会进入shared

如果您尝试将其放入sharedGWT Eclipse Plugin会抱怨“缺少异步接口”......

3 个答案:

答案 0 :(得分:4)

让我们试着说清楚:

  • 客户端共享包之间没有技术差异,这只是一个常规问题。两者都在模块中声明为源包( .gwt.xml 文件)
  • 客户端共享包已编译为 javascript 字节码
  • 服务器一侧,整个客户端部分的字节码通常可用,但大多数未使用
  • 因此,有些人只是删除共享包,并将所有内容放在客户端包中。这是一个品味问题。
  • 正如Thomas所说,Service接口必须可用于您的客户端代码。因此,它必须位于客户端包或共享包中。但ServiceAsync接口必须与Service接口位于同一个包中。 ServiceAsync肯定不是客户端服务器之间共享的内容。因此,ServiceASync界面应位于客户端包中。
  • 因此,Service界面会放在客户端包中。
  • 在您的情况下, GWT Eclipse插件抱怨,因为在ServiceASync接口包中找不到Service接口。
  • 您仍然可以将共享包用于通过 RPC 发送的类。

这会回答你的问题吗?

答案 1 :(得分:0)

在我的项目中,ServiceServiceAsync都位于shared,一切正常。实际上我没有看到任何其他方式SercviceImpl server实现Service接口,编译器需要将它们放在类路径上。

答案 2 :(得分:0)

GWT-RPC生成器使用命名约定(将Async后缀添加到类名),在Service中添加“包重命名规则”shared,同时ServiceAsyncclient)是不适合许多人的包布局。因此,规则是两个接口都在同一个包中,无论包的名称如何,如果你愿意,可以将它们放在shared中(如Peter Knego所说)

(该规则也归功于遗留问题,最近在GWT项目中引入了shared约定,相对于GWT-RPC而言