1

我有我的 GWT 项目,另一个项目只有简单的域对象,没有任何 GWT 特定的项目。

在我的域对象项目中,我有一个 Bob 类,它有一些原始字段。没什么特别的。他为此实现了 Serializable 。

我想从 GWT 服务方法返回这种类型。得知服务方法只能返回实现 GWT 的 IsSerializable 接口的类,我创建了 Bob 的子类 BobSO(Bob 服务对象),并让它实现了 IsSerializable。

基本项目结构

proj> Bob.java

proj_gwt
proj_gwt > projgwt.gwt.xml
proj_gwt.client
proj_gwt.server
proj_gwt.shared > BobSO.java

运行服务时出现错误。似乎它正在加载 BobSO,并为超类 Bob 寻找源,但找不到源。“[文件路径] 第 6 行中的错误:Bob 没有可用的源代码,您是否忘记继承所需的

  1. 自从他实现 IsSerializable 后,BobSO 的子类会起作用吗?
  2. 看起来 GWT 知道 BobSO 在哪里。我需要做什么才能知道 Bob.java 的来源在哪里?我尝试在我的域对象项目中创建一个 gwt.xml,但我不确定它是否需要列出每个应该可见的类,以及如何在我的 GWT 项目中导入它。
4

3 回答 3

2

1.可串行化

实现 Serializable 或 IsSerializable,并确保该类满足 GWT 可序列化的其余要求(无参数构造函数,无最终字段,...)

2. 定位来源

您需要创建一个模块来帮助 GWT-RPC 找到可序列化的类[*]

模块“gwt.xml”可以存在于您的域项目中。或者,如果您不想接触域项目,它也可以存在于您的 GWT 项目中 - 只需确保将其放入正确的包中:

领域项目

src
  bar
    domain
      Bob.java

Gwt项目

src
  bar
    Domain.gwt.xml (contains <src path='domain'/>)
  foo
    client
      MyEntryPoint.java
    shared
      BobSO.java
    Bar.gwt.xml (contains <src path='client'/>
                          <src path='shared'/>
                          <inherits name="foo.Domain"/>)

重要笔记

  • 确保在更改此类依赖项后删除 gwt-unitCache 文件夹。否则,编译器通常会以奇怪的方式失败(使用 gwt 2.5.0.rc2 测试)。
  • 始终将源文件夹提供给 GWT 编译器,以获取客户端需要了解的所有内容。在这种情况下,这也是bar.domain.Bob.

笔记

  • 也可以将 Domain.gwt.xml 放在“bar/domain”包中,并使用<source path=""/>

[*] 顺便说一句,在 GWT 中,为依赖项定义一个模块通常甚至不是绝对必要的,这可能会令人惊讶。(但是,当涉及 GWT-RPC 时,它是必需的。)如果您愿意,可以通过一个简单的示例来尝试 - GWT 将自行查找源 -只要它们位于 GWT 编译器的类路径中

于 2012-10-11T20:53:07.630 回答
1

Will by BobSO subclass work since he implements IsSerializable?

It should work, but note that IsSerializable is the "old" marker interface for GWT. You can now use java.io.Serializable instead.

It looks like GWT knows where BobSO is. What do I need to do to so it knows where the source to Bob.java is? I've tried creating a gwt.xml in my DOmain Objects project, but I'm not sure if it needs to list each class that should be visible, and how to import it in my GWT project.

I think that creating a GWT module in your domain project is the right approach. You don't have to list each class. The "path" attribute of the "source" element should contain the name of a child package:

<module>
    <source path="mysubpackage" />
</module>

You can have more that one source element if you have multiple packages. You can also include/exclude specific classes from a package, e.g.:

<source path="somepackage">
    <include name="SomeClass.java" />
    <include name="stuff/OtherClass.java" />
    <exclude name="blah/**" />
</source>

To import it in your original GWT module, simply add an "inherits" entry with the fully qualified name of the .gwt.xml file you created, but without the ".gwt.xml" extension. Assuming your new module file is called Domain.gwt.xml and is located in package "com.domainpackage", you would add:

<inherits name="com.domainpackage.Domain" />
于 2012-10-11T16:21:50.760 回答
0

您可以将项目打包为 jar,并将其添加到 GWT 项目的类路径中。

于 2012-10-11T14:30:28.850 回答