2014-03-31 50 views
1

我正在使用來自第三方系統的一組DTD。我們的目標是將XML請求(符合這些DTD的請求映射到java中,然後將XML響應發送回系統)。如何自定義和覆蓋jaxb綁定

DTDs是用石頭寫的(我沒有任何控制改變它們)。

因此,爲了映射,我使用XMLSpy將DTD轉換爲XML Schemas(xsd),然後使用XJC編譯器創建Jaxb綁定類。我正在使用Java 7.

問題是,DTD沒有真正的名稱空間..我有20個不同的DTD .. 10個用於請求,10個用於響應。當我生成模式時,我必須做一對一的映射..並創建了相同的10個請求XSD和10個響應XSD。

現在,jaxb xjc編譯器生成綁定類..但它們遠沒有實際用途。沒有繼承關係,因爲這些模式不相互關聯(雖然它們似乎有相似的內容 - 請求類型和響應類型)。

有人可以幫助我,如果有一種方法來定製jaxb綁定來覆蓋默認綁定並創建更合理的綁定?

例如,考慮這個簡單的例子:

DTD:

<xs:element name="FromDate"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="year" use="required"/> 
     <xs:attribute name="month" use="required"/> 
     <xs:attribute name="day" use="required"/> 
    </xs:complexType> 
</xs:element> 

表示出來XJC編譯器生成的綁定類(java的1.7:我生成使用XMLSpy的

<!ELEMENT FromDate (#PCDATA)> 
<!ATTLIST FromDate 
    year CDATA #REQUIRED 
    month CDATA #REQUIRED 
    day CDATA #REQUIRED 
> 

架構):

public class FromDate { 

    @XmlValue 
    protected String content; 
    @XmlAttribute(name = "year", required = true) 
    @XmlSchemaType(name = "anySimpleType") 
    protected String year; 
    @XmlAttribute(name = "month", required = true) 
    @XmlSchemaType(name = "anySimpleType") 
    protected String month; 
    @XmlAttribute(name = "day", required = true) 
    @XmlSchemaType(name = "anySimpleType") 
    protected String day; 
    ... 
    ... 

如果你看一下沒有fromdate最終如何演變,它沒有任何意義「CUS只是從這個請求獲取日期,我需要做的

setMyDate(request.getFromDate().getMonth() + request.getFromDate().getDay() + request.getFromDate().getYear()); 

這顯然是沒有意義的。另外,類型是遠離的。

如何自定義/覆蓋JAXB綁定來實現這兩個東西: 1.繼承(某種抽象的,以減少冗餘) 2.適當類型

請幫助。

回答