无法从GWT服务返回自定义类

时间:2012-10-11 14:16:52

标签: gwt

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

在我的Domain Objects项目中,我有一个类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行:鲍勃没有源代码可以忘记继承所需的

  1. BobSO子类是否会因为实现IsSerializable而工作?
  2. 看起来GWT知道BobSO在哪里。我需要做什么才能知道Bob.java的来源在哪里?我已经尝试在我的DOmain Objects项目中创建一个gwt.xml,但我不确定是否需要列出每个应该可见的类,以及如何在我的GWT项目中导入它。

3 个答案:

答案 0 :(得分:2)

1。串行化

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

2。找到来源

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

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

<强> DomainProject

src
  bar
    domain
      Bob.java

<强> GwtProject

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就会自己找到源 -

答案 1 :(得分:1)

  

BobSO子类是否会因为实现IsSerializable而工作?

它应该可以工作,但请注意,IsSerializable是GWT的“旧”标记接口。您现在可以使用java.io.Serializable。

  

看起来GWT知道BobSO在哪里。我需要做什么才能知道Bob.java的来源在哪里?我已经尝试在我的DOmain Objects项目中创建一个gwt.xml,但我不确定它是否需要列出每个应该可见的类,以及如何在我的GWT项目中导入它。

我认为在您的域项目中创建GWT模块是正确的方法。您不必列出每个班级。 “source”元素的“path”属性应包含子包的名称:

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

如果您有多个包,则可以拥有多个源元素。您还可以在包中包含/排除特定类,例如:

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

要在原始GWT模块中导入它,只需添加一个“inherits”条目,其中包含您创建的.gwt.xml文件的完全限定名称,但不带“.gwt.xml”扩展名。假设您的新模块文件名为Domain.gwt.xml并位于“com.domainpackage”包中,您可以添加:

<inherits name="com.domainpackage.Domain" />

答案 2 :(得分:0)

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