如何在JAX-WS客户端中重用服务器端类?

时间:2011-05-14 16:07:39

标签: jaxb jax-ws

我在服务器端有一个类:ForumEntry,我有一个Web服务,它返回一个ForumEntry列表:

@WebService(name="ForumGeneral",serviceName="ForumGeneralService")
public class ForumGeneralService {

  @WebMethod
  public List<ForumEntry> getLatestTopics(String keyword,int count){
  ...
  }
}

当使用wsimport生成webservice客户端时,它完成得很好,但是基于Web服务创建了一个新的ForumEntry类型。这是有道理的,因为Web服务的本质是客户端和服务器端是分离的。

但是如果我想重用服务器端的ForumEntry并避免创建客户端虚拟类呢?

我找到了一个帖子:http://jamablog.blogspot.com/2007/08/how-to-make-jax-ws-client-reuse_22.html

按照这个想法,我将jaxb注释添加到我的服务器端ForumEntry类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "forumEntry", propOrder = {
    "forumId",
    "forumName",
})
public class ForumEntry

然后使用schemagen生成剧集文件,然后使用-b参数将其传递给wsimport。但是我遇到了问题,因为生成的剧集文件包含'forumEntry'的条目:

[ERROR] SCD "~forumEntry" didnt match any schema component

我想这意味着'forumEntry没有出现在WSDL中,这是对的:

<message name="getLatestTopics">
<part name="parameters" element="tns:getLatestTopics"></part>
</message>
<message name="getLatestTopicsResponse">
<part name="parameters" element="tns:getLatestTopicsResponse"></part>
</message>

那么如何将所有部件组合在一起,重用服务器端类?

1 个答案:

答案 0 :(得分:-1)

您应该将一个ForumEntry类添加到架构中,以便客户端可以生成它,并在服务器端使用该生成的类。或者向您的架构添加一个新类,其中包含与ForumEntry类似的数据,并让服务器在您的ForumEntry对象的响应中创建这些对象,并返回这些创建的对象。