2011-03-30 82 views
2

如何在使用wsimport時爲WSDL中導入的XSD指定JAXB綁定?爲導入的XML Schema合併JAXB和JAXWS

我試過下面的綁定,這會導致錯誤「XPath評估// xs:element [@ name ='isFoobar']導致一個空的目標節點」。

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="example.wsdl" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
    <jaxws:bindings node="wsdl:definitions"> 
     <jaxws:bindings node="wsdl:types" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
      <jaxws:bindings 
       node="//xs:schema[@targetNamespace='http://www.example.org/']"> 
       <jaxb:globalBindings> 
        <xjc:serializable uid="10000001" /> 
       </jaxb:globalBindings> 
       <jaxb:bindings 
        node="//xs:element[@name='isFoobar']"> 
        <jaxb:typesafeEnumClass name="IsFoobar"> 
         <jaxb:typesafeEnumMember value="01" name="TRUE" /> 
         <jaxb:typesafeEnumMember value="02" name="FALSE" /> 
        </jaxb:typesafeEnumClass> 
       </jaxb:bindings> 
      </jaxws:bindings> 
     </jaxws:bindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

任何想法?

+0

你找到一種方法去做你想做的事情嗎?我很感興趣。 – Thomas 2011-04-26 16:31:15

回答

1

我年齡相仿前做了什麼,我想你需要指定節點與XPath來選擇如下:

//xs:element[@name='isFoobar']/xs:complexType 

或更換XS:您所使用這裏無論何種類型的複雜類型。希望它能解決你的問題。

+0

我沒時間去測試它。但我接受它,因爲沒有其他建議。 – 2011-04-26 14:43:14

+0

那麼,接受沒有測試可能會誤導別人 – 2017-12-06 11:59:29

1

我第一次嘗試解決這個問題時,試圖以某種方式使用XPath或多個jxb:binding元素,但這不起作用。據我所知,XPath只是不能正確驗證導入的模式,除非它將全部重寫並與DOM一起進行混合。

所以我解決這個問題的方式是在導入的XSD中使用inline customizations。我沒有用多個嵌套導入來測試這種方法,但是如果您有權限並且有時間修改所有導入的XSD,則應該可以正常工作。在我看來,這隻有在您需要生成映射時纔是必需的,並且一旦完成映射,就可以從XSD中清理/刪除映射。

1

對不起,necro-threading,我遇到了這個問題,雖然這是第一個答案,谷歌與各種關鍵字組合出現在它沒有舉行我最終使用的答案。


對於導入的模式,最簡單的方法來指定一個JAXB WSDL中對進口XSD綁定...把它當作一個完全不同的模式!

短的例子:

MyXSD.xsd

<xsd:schema targetNamespace="whatever" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="ThingThatNeedsToBeBound"> 
     <!-- Whatever this is made of --> 
    </xs:complexType> 
</xsd:schema> 

無論身在何處此XSD導入物質(閹這是在我的WSDL嵌套進口或在根目錄下),所有的I需要寫我的 「ThingThatNeedsToBeBound」 綁定在我的自定義綁定:

customBindings.xml

<jaxb:bindings schemaLocation="Path/To/MyXSD.xsd" node="/xs:schema/xs:complexType[@name='ThingThatNeedsToBeBound']"> 
    <!-- your custom binding --> 
</jaxb:bindings> 

因此,除了指定schemaLocation之外,它就像常規情況一樣,但是您可以將導入的模式視爲一個整體,而不是某個部分。

我希望這會幫助別人磕磕碰碰這個問題。


來源:http://www.oracle.com/technetwork/articles/grid/jax-ws-jaxb-customization-082750.html

(注:在源,解決方案似乎辦法比較複雜,所以我的情況可能已經比他們描述的這麼簡單,我發現我的解決方案使用的是沒有少!)

+0

我無法測試它,但這聽起來很合理。順便說一句,沒有這樣的事情在StackOverflow上的necro-threading。問題和答案應該保持最新。 :-) – 2017-03-13 18:20:24