【问题标题】:Can't return custom class from GWT Service无法从 GWT 服务返回自定义类
【发布时间】:2012-10-11 14:16:52
【问题描述】:

我有我的 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. BobSO 的子类在他实现 IsSerializable 后能否正常工作?
  2. 看起来 GWT 知道 BobSO 在哪里。我需要做什么才能知道 Bob.java 的来源在哪里?我尝试在我的域对象项目中创建一个 gwt.xml,但我不确定它是否需要列出每个应该可见的类,以及如何在我的 GWT 项目中导入它。

【问题讨论】:

    标签: gwt


    【解决方案1】:

    1。可序列化

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

    2。定位来源

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

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

    域项目

    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”包中,使用&lt;source path=""/&gt;

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

    【讨论】:

      【解决方案2】:

      BobSO 的子类在他实现 IsSerializable 后会起作用吗?

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

      看起来 GWT 知道 BobSO 在哪里。我需要做什么才能知道 Bob.java 的来源在哪里?我尝试在我的域对象项目中创建一个 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 模块,只需添加一个“继承”条目,其中包含您创建的 .gwt.xml 文件的完全限定名称,但没有“.gwt.xml”扩展名。假设您的新模块文件名为 Domain.gwt.xml 并且位于包“com.domainpackage”中,您将添加:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 2011-09-13
          • 1970-01-01
          • 2013-05-18
          相关资源
          最近更新 更多