2009-01-13 108 views
0

我正在使用CXF公開Web服務。我正在使用@XmlID和@XmlIDREF JAXB註釋在編組/解組期間維護對象圖的參照完整性。JAXB XmlID和XmlIDREF註釋(架構到Java)

WSDL正確地包含具有xs:id和xs:idref屬性的元素來表示該屬性。

在服務器端,一切正常。用@XmlIDREF註解的類型實例與用@XmlID註解註釋的實例是相同的實例(如==)。

但是,當我使用WSDLToJava生成客戶端時,引用(使用@XmlIDREF註釋的引用)的類型爲java.lang.Object。

有沒有什麼辦法可以自定義JAXB綁定,使得引用的類型是java.lang.String(與引用類型的ID匹配)還是與引用類型本身相同?

回答

0

好的,所以這是行不通的。 JAXB不可能爲IDREF生成正確類型的代碼,因爲模式不能指定引用的類型,並且IDREF可能指向不同的複雜類型。 JAXB將如何知道引用的類型是什麼? XML Schema的擴展將做到這一點! :)

0

以下似乎至少爲xs:IDREF類型的元素/屬性創建字符串屬性。一個好的開始,但理想情況下,JAXB將生成與被引用元素相同類型的屬性。如果/當我找到如何做到這一點,我會回報。這個結果可能表明我需要編寫我自己的轉換器,這將是一個恥辱。

<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <jxb:globalBindings> 
      <jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" /> 
     </jxb:globalBindings> 
</jxb:bindings> 
1

使用內聯JAXB綁定來指示要使用的類型。然後JAXB生成的代碼將具有正確的類型。

<complexType name="Column"> 
    <sequence> 
     <element name="name" type="string" maxOccurs="1" minOccurs="1"></element> 
     <element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0"> 
      <annotation> 
       <appinfo> 
        <jaxb:property> 
         <jaxb:baseType name="Column"/> 
        </jaxb:property> 
       </appinfo> 
      </annotation> 
     </element> 
    </sequence> 
    <attribute name="id" type="ID" use="required"></attribute> 
</complexType> 

另外請注意,您必須聲明中schema元素的jaxb命名空間和JAXB版本。

<schema targetNamespace="http://example.com/schema" 
    elementFormDefault="qualified" 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="1.0">