有没有办法GWT编译器/串行器/链接器问题?

时间:2011-03-16 19:01:40

标签: gwt gwt-rpc

让我说我有一个班级......

com.mycom.app.AbstractMessage

中还有另一个班级

com.mycom.model.QueryResponse

QueryResponse扩展了AbstractMessage并注意到它们处于不同的pacakges

com.mycom.model 是一个GWT模块,在模块XML中

当我编译模型时,会出现错误。但是,当我尝试在另一个GWT模块中使用QueryReponse时,我得到运行时错误

“没有源代码可用于类型com.mycom.app.AbstractMessage;您是否忘记继承所需的模块”

这让我相信AbstractMessage没有被编译/编译,可以理解,因为我不想让“app”包成为GWT模块

换句话说,我只想编译“model”中的所有类,而不是任何超类。如何告诉GWT编译器/ rpc /链接器/序列化器等不要这样做?

即有没有办法告诉GWT在序列化/编译时不要超越某些类

我这样做是一个源环境,我们有很多软件包,大多数只依赖于MODEL,我不想在每个软件包中创建一个GWT模块,只是因为它编译。<​​/ p>

有人想到吗?

3 个答案:

答案 0 :(得分:0)

我建议将 AbstractMessage 移动到模型包中 - 因为它是模型 QueryResponse 的超类。

如果超级类中只有0个字段和方法(行为),那么模型中的插入只是一个好主意。

最后,如果GWT要将 QueryResponse 变成javascript - 它需要源文件中提到的所有类型,才能正确编译。因此,请不要在源文件中提及任何仅用于服务器的类,以便成为javascript。

拥有一个区域,其中包含将在服务器上的JVM中运行的所有服务器端Java类,以及另一个充满源文件的区域,这些区域将由GWT编译器编译为javascript。 服务器端区域代码/类CAN指的是客户端区域代码/类,但是反之亦然,反之亦然。确保没有成为javascript的代码(甚至是未使用的import语句)引用到服务器端类。

GWT编译器仅适用于源文件,但是您需要将客户端代码编译为.class文件,以便您的服务器端类可以引用它们。

新编辑:

我对这个进行了一些研究,你是对的GWT将寻找Abstract类的所有实现,当且仅当在RPC GWTAsync接口中引用AbstractClass时,即使有些是非GWT包。

假设一个AbstractClass类型的对象通过网络进入,而GWT解串器现在的任务是将网络数据转换为特定的实例。它需要了解AbstractClass的所有实现,以便找到现在通过网络传输的内容! - 为此,为了实现这一点,在编译时,为每个GWT服务接口生成一个.rpc文件,列出服务方法可以返回的所有可能的具体类型。

Ray Ryan(谷歌员工)曾经提到在任何RPC接口中使用接口参数或返回类型是一个坏主意。 - 因为它使解串器很难知道确切的类型。

您可以手动编辑生成的RPC文件并删除有问题的类型,或者通过在其他包中的那些实现中不实现Serializable来将其他实现标记为Non Serializable。

更好的方法是 - 我怀疑你在顶级编写代码:“implements java.io.Serializable”(对于AbstractClass本身),也许现在是时候将它移到每个实现中了。

现在,GWT RPC解串器的任务清晰明了 - 它知道只有AbstractClass的某些实现(可序列化的)才会通过网络,并且只能到达和编译它们。因此它不会编译AbstractClass的其他非可序列化子类 - 因为它知道它们不可序列化。

答案 1 :(得分:0)

还有一个选项:如果我怀疑你正在使用命令模式 - 我已经看到所有的抽象接口,命令和响应的超类等总是进入客户端包 - 即那些是GWT编译的。对于应用程序的服务器端,它们是可引用的,可用的和可实例化的 - 因此这些源文件被编译两次,一次由GWT编译为javascript以供浏览器使用,一次通过javac进入字节码以允许从服务器端引用。因此,在所有GWT模块中,包括gwt-user.jar,如果用7Zip或WinZip打开它们,你会看到源文件和类文件一起JAR。

答案 2 :(得分:0)

我对这个进行了一些研究,你是对的GWT将寻找Abstract类的所有实现,当且仅当在RPC GWTAsync接口中引用AbstractClass时,即使有些是非GWT包。

假设一个AbstractClass类型的对象通过网络进入,而GWT解串器现在的任务是将网络数据转换为特定的实例。它需要了解AbstractClass的所有实现,以便找到现在通过网络传输的内容! - 为了实现这一点,在编译时,它为每个GWT服务接口生成一个.rpc文件,列出服务方法可以返回的所有可能的具体类型。

Ray Ryan(谷歌员工)曾经提到在任何RPC接口中使用接口参数或返回类型是一个坏主意。 - 因为它使解串器很难知道确切的类型。

您可以手动编辑生成的RPC文件并删除有问题的类型,或者通过在其他包中的那些实现中不实现Serializable来将其他实现标记为Non Serializable。

更好的方法可能是 - 我怀疑你编写了代码:“在顶级实现java.io.Serializable”(对于AbstractClass本身),也许现在是时候将它移到每个实现中了。

现在,GWT RPC解串器的任务清晰明了 - 它知道只有AbstractClass的某些实现(可序列化的)才会通过网络,并且只能到达和编译它们。因此它不会编译AbstractClass的其他非可序列化子类 - 因为它知道它们不可序列化。