6

我使用 JAX-WS 创建了一个小型 Web 服务。WSDL 文件具有这样的 TYPES 元素。

<types>
  <xsd:schema>
  <xsd:import namespace="http://ws.poc.mawia/" schemaLocation="http://localhost:777/ws/hello?xsd=1"/>
  </xsd:schema>
</types>

Web 服务的 URL 是http://localhost:777/ws/hello?wsdl,XSD 是http://localhost:777/ws/hello?xsd=1. 不同位置的 XSD Schema 文件具有这样的数据类型定义。

...
 ...
    <xs:complexType name="student">
     <xs:sequence>
     <xs:element name="name" type="xs:string" minOccurs="0"/>
     <xs:element name="rollNo" type="xs:int"/>
     </xs:sequence>
    </xs:complexType>
  ...
 ...

我见过的大多数 WSDL 文件通常在 WSDL 文件本身内都有完整的 XSD 定义,但 JAX-WS 将它放在不同的位置。

这是应该的吗?如何配置 JAX-WS 以将所有 XSD 定义放在一个 WSDL 文件中?

4

2 回答 2

9

这是应该的吗?

将 XSD 与 WSDL 分离是 JAX-WS 中的默认行为,您不必太担心它。最新的 WS 框架(包括 WCF)通常能够处理这个问题。根据 XSD 的大小,导入它可能会使 WSDL 对人类来说更具可读性。对于小型 Web 服务,嵌入模式当然更容易,但导入它也不是什么大问题。

如何配置 JAX-WS 以将所有 XSD 定义放在一个 WSDL 文件中?

我不知道使运行时将模式嵌入 WSDL 的直接方法,但是有一种解决方法可以实现此目的:

  1. 发布您的端点并保存 WSDL 和 XSD
  2. 手动将 XSD 的内容复制到typesWSDL 部分并替换那里的模式导入
  3. 将合并的 WSDL 文件保存在您的应用程序可以将其作为资源访问的位置
  4. 让您的 Web 服务加载合并的 WSDL。这将停止动态生成,但是,您必须在每次更改界面时手动更新 WSDL

您可以通过自定义@WebService注释来实现 4.。这可能看起来像这样:

@WebService( wsdlLocation = "MyWebService.wsdl")
public class MyWebService { .... }
于 2013-04-16T08:56:56.133 回答
0

你的方法没有任何问题。使用 URL 指向另一个 wsdl 的 WSDL 很好。

如果您不想要它,请使用 @WebService 注释的 wsdlLocation 属性提及 wsdl 位置。但是再次使用这种方法,您将不得不手动修改 wsdl。

于 2013-04-16T09:59:48.593 回答