为什么GWTRPC * Service Interface类放在“ .client”包而不是“ .shared”包中?

Eri*_*ric 3 gwt gwt-rpc

通过查看GWT示例应用程序和RPC教程,可以使用以下包约定:

./client/GreetingService.java
./client/GreetingServiceAsync.java
./server/GreetingServiceImpl.java
Run Code Online (Sandbox Code Playgroud)

尽管GWT文档在最佳实践方面非常稀疏,但在运行时将哪些组件包括在其中,但显而易见的直觉是:

  • 客户端-通过GWT编译器编译为JavaScript
  • 服务器-由javac编译成字节码
  • 共享-通过GWT编译器编译为JavaScript,通过javac编译为字节码

这将导致一个相信该代码client应该上的javac编译时源路径。然而,由于GreetingServiceImpl实现了GreetingService,显然client在编译过程中,代码必须位于源路径上,并在部署时包含在运行时类路径中。

鉴于此,为什么GreetingService接口不进入shared

如果尝试将其放入shared,则GWT Eclipse插件会抱怨“缺少异步接口” ...

Pie*_*cau 5

让我们尝试弄清楚:

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

这是否回答你的问题?