JAX-WS在不同的URL中具有XSD架构

Maw*_*wia 6 java xsd wsdl web-services jax-ws

我使用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>
Run Code Online (Sandbox Code Playgroud)

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

...
 ...
    <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>
  ...
 ...
Run Code Online (Sandbox Code Playgroud)

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

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

joe*_*rgl 8

这应该是怎么回事?

将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 { .... }
Run Code Online (Sandbox Code Playgroud)