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

时间:2013-04-16 06:52:25

标签: java web-services xsd wsdl 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>

网络服务的网址为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>
  ...
 ...

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

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

2 个答案:

答案 0 :(得分:8)

  

这应该是怎么回事?

将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
  5. 您可以通过自定义@WebService注释来实现4.这可能看起来像这样:

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

答案 1 :(得分:0)

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

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