1

我们正在使用 Apache CXF 代码优先方法来创建 Web 服务。我们有一个自定义的肥皂头来传递用户凭据。

我正在尝试使用 @webparam 注释在 SEI 中传递用户凭据。

这是 Service 类中的两个操作。

@Path("/item/{id}")
@GET
public Item getItem(@PathParam("id") String id,
 @WebParam(name="userDetails", header=true, mode=Mode.IN) UserDetails details) throws NotFoundException;

@Path("/name/{id}")
@GET
public Item getItemByName(@PathParam("id") String id,
 @WebParam(name="userDetails", header=true, mode=Mode.IN) UserDetails details) throws NotFoundException;

生成 wsdl 时发音会抛出错误,说

D:\workspace\myService\src\main\java\com\ws\api\ItemPublicationWebService.java:52: [xml] Web 方法定义了一个名为“userDetails”的消息部分,它与定义的 Web 消息部分的名称相同在 D:\workspace\myService\src\main\java\com\ws\api\ItemPublicationWebService.java:41。请使用注释来消除歧义。

我发现保持 webParam 名称唯一会生成 wsdl。但这不是预期的结果。

我在这里想念什么?

4

1 回答 1

0

Enunciate 在这里所做的是尝试为您的 Web 服务 API 构建一个漂亮、干净、统一的 WSDL。Enunciate 与其他 WSDL 生成器不同,因为它在编译时工作,并尝试将所有标题元素分组到 WSDL 可以引用的单个统一 XML 模式文件中。(其他 WSDL 生成器在运行时工作,因此可以根据需要动态生成模式,但是有很多重复的 XML 元素等)

因此,当 Enunciate 遇到您的“getItem”方法时,它会看到名为“userDetails”的标题元素,并将该 XML 元素添加到正在生成的 XML 模式文档中。然后,Enunciate 遇到您的“getItemByName”方法,发现还有另一个名为“userDetails”的标题元素,它不够聪明,无法看出它们是同一个元素。所以认为有冲突,它会抛出一个错误。

我为您记录了一个 JIRA 问题:

http://jira.codehaus.org/browse/ENUNCIATE-453

现在,如果您不关心让 Enunciate 为您生成 WSDL,您可以禁用 'xml' Enunciate 模块:

<enunciate...>
  ...
  <modules>
    <xml disabled="true"/>
  </modules>
</enunciate>
于 2010-07-01T17:31:14.543 回答