簡體   English   中英

使用wsimport導入WSDL時,為xsd:any元素提供模式

[英]Provide schema for xsd:any element while importing WSDL using wsimport

我有一個WSDL,它在其中一種方法的返回類型中使用xsd:any元素,如下所示:

<xs:element name="Method_XMLResponse">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Method_XMLResult">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:any/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

當我通過wsimport工具運行WSDL時,會得到一個生成的類,該類具有xs:any字段映射為對象列表:

public static class MethodXMLResult {

    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;

}

使用生成的代碼調用服務時,我在content列表中獲得了org.w3c.dom.Node實例(准確地說是com.sun.org.apache.xerces.internal.dom.ElementNSImpl ),我需要對其進行解析我。 但是,為我提供了一個單獨的外部架構文檔,用於實際返回的對象-我正試圖以某種方式將其饋送到wsimport以便它也為它們生成類。

我正在嘗試通過這樣的JAX-WS / JAXB定制文件來實現:

<jaxws:bindings xmlns:s="http://www.w3.org/2001/XMLSchema"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:a="http://www.w3.org/2001/XMLSchema"
                wsdlLocation="wsdlLocation.wsdl">

    <jaxws:bindings node="wsdl:definitions">
        <jaxws:bindings node="wsdl:types" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <jaxws:bindings node="//s:schema[@targetNamespace='wsNamespace']">
                <jaxb:bindings node="//s:element[@name='Method_XMLResponse']//s:any">
                  ...
                </jaxb:bindings>
            </jaxws:bindings>
        </jaxws:bindings>
    </jaxws:bindings>
</jaxws:bindings>

看起來wsimport選擇了正確的位置進行自定義(給我許多錯誤消息,並在WSDL中正確指定了行號),但是我不知道如何填充<jaxb:bindings>元素以使wsimport從外部生成類模式。 可能嗎? 任何幫助將非常感激。

我看到您在XSD中使用xs:any混合類型。 我認為在JAXB調整后對混合類型進行優化很有用:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
 xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
 xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">

  <jaxb:globalBindings generateMixedExtensions="true"/>

</jaxb:bindings> 

您可以將外部JAXB綁定文件添加到wsimport whith -b參數

我認為您可以通過以下方式調整xs:any:

跳過shema:

<xs:any processContents="skip" maxOccurs="unbounded" minOccurs="0" />

跳過綁定:

@XmlAnyElement
  public List<Element> getAny();

嚴格的架構:

<xs:any maxOccurs="unbounded" minOccurs="0" />

嚴格綁定:

@XmlAnyElement(lax=true)
  public List<Object> getAny();

和:

使用processContents = lax表示可以在此處放置任何XML元素,但是如果它們的元素名稱與模式中定義的名稱匹配,則它們必須有效。 實際上,XJC完全像processContents ='strict'一樣處理此問題,因為嚴格綁定始終允許未知元素。

您可以在此鏈接中了解更多信息

可能有助於此答案完成您的JAX-WS / JAXB定制文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM