【问题标题】:JAX-WS has XSD schema in different URLJAX-WS 在不同的 URL 中有 XSD 模式
【发布时间】:2013-04-16 06:52:24
【问题描述】:

我使用 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 文件中?

【问题讨论】:

    标签: java web-services xsd wsdl jax-ws


    【解决方案1】:

    应该是这样吗?

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

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

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

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

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

    @WebService( wsdlLocation = "MyWebService.wsdl")
    public class MyWebService { .... }
    

    【讨论】:

    • MyWebService 是类还是接口?
    • 在我这里的设置中,它是一个类。 MyWebService 仍然实现了一个接口(带有@WebService 注释)并使用endpointInterface 属性指向该接口。又名:@WebService( endpointInterface="some.package.MyPortType", ...)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      相关资源
      最近更新 更多