Can';t从GWT服务返回自定义类

Can';t从GWT服务返回自定义类,gwt,Gwt,我有我的GWT项目,另一个项目只有简单的域对象,没有GWT特定的内容 在我的域对象项目中,我有一个类Bob,它有一些基本字段。没什么特别的。他实现了Serializable 我想从GWT服务方法返回这种类型。了解到服务方法只能返回实现GWT的IsSerializable接口的类,我创建了Bob的子类BobSO(Bob服务对象),并让它实现IsSerializable 基本项目结构 proj> Bob.java proj_gwt proj_gwt > projgwt.gwt.xml

我有我的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没有可用的源代码。您是否忘记继承必需的

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

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

    BobSO的子类会工作吗,因为他实现了IsSerializable

    它应该可以工作,但请注意IsSerializable是GWT的“旧”标记接口

    看起来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模块中,只需添加一个“inherits”条目,该条目具有您创建的.GWT.xml文件的完全限定名,但没有“.GWT.xml”扩展名。假设您的新模块文件名为Domain.GWT.xml,并且位于包“com.domainpackage”中,您将添加:

    <inherits name="com.domainpackage.Domain" />
    
    
    
    1.可串行化 实现Serializable或IsSerializable,并确保该类满足GWT序列化的要求(无参数构造函数,无最终字段,…)

    2.确定来源 您需要创建一个模块来帮助GWT-RPC查找可序列化类[*]

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

    域项目

    src
      bar
        domain
          Bob.java
    
    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项目

    src
      bar
        domain
          Bob.java
    
    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"/>)
    
    src
    酒吧
    Domain.gwt.xml(包含)
    福
    客户
    MyEntryPoint.java
    共享
    BobSO.java
    Bar.gwt.xml(包含
    )
    
    重要注意事项
    • 确保在更改这些依赖项后删除gwt unitCache文件夹。否则,编译器通常会以奇怪的方式失败(使用gwt 2.5.0.rc2测试)
    • 始终向GWT编译器提供源文件夹,以了解客户端需要了解的所有信息。在本例中,这也是
      bar.domain.Bob
      的源文件夹
    • 还可以将Domain.gwt.xml放入“bar/Domain”包中,并使用
    [*]顺便说一句,在GWT中为依赖项定义一个模块通常是不必要的,这可能会让人感到惊讶。(但是,当涉及GWT-RPC时,它是必需的。)如果您愿意,可以用一个简单的例子试试看——GWT将自己找到源代码——只要它们在GWT编译器的类路径上