2016-04-28 47 views
0

我正在使用JAXB從XSD生成代碼。我有一個外部綁定文件,它定義了其中一種XSD類型的實現類型(使用class標記/ implClass屬性)。當我這樣做時,生成的ObjectFactory被修改爲返回指定實現類的實例。但是,生成的類仍然使用生成的基礎類型聲明成員。有沒有辦法使生成的XSD類型引用的所有用法代替我的實現類型?JAXB綁定全局替換類型與實現類

作爲一個例子,假設 「example.xsd」 如下:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ...> 
    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Member" type="MemberType" maxOccurs="unbounded" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="MemberType" /> 
</xsd:schema> 

然後,我有以下 「bindings.xjb」 文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      schemaLocation="example.xsd" node="/xsd:schema" version="2.1"> 
    <bindings node="./xsd:complexType[@name='MemberType']"> 
    <class implClass="myNamespace.Member" /> 
    </bindings> 
</bindings> 

運行xjc後產生JAXB類在上面的場景中,我得到一個ObjectFactory類,其中包括以下方法:

public MemberType createMemberType() { 
    return new Member(); 
} 

因此,工廠正在爲MemberType正確生成我的實施實例。但是,生成Root類的實現包括:

protected List<MemberType> member; 
public List<MemberType> getMember() { 
    if (member == null) { 
     member = new ArrayList<MemberType>(); 
    } 
    return this.member; 
} 

我反而喜歡,實現的:

protected List<Member> member; 
public List<Member> getMember() { 
    if (member == null) { 
     member = new ArrayList<Member>(); 
    } 
    return this.member; 
} 

有沒有辦法來指定,我想內的myNamespace.Member更換MemberType「 bingings.xjb「?由於這種配置,我預計ObjectFactory.createMemberType的結果也會改變。謝謝。

回答

0

經過多次試驗和錯誤,我終於找到了一種方法來做到這一點。以下是工作 「bindings.xjb」 文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      schemaLocation="example.xsd" node="/xsd:schema" version="2.1"> 
    <bindings node="./xsd:complexType[@name='MemberType']"> 
    <class implClass="myNamespace.Member" /> 
    </bindings> 
    <bindings node="//xsd:element[@name='Member']"> 
    <property name="Members"> 
     <baseType name="myNamespace.Member" /> 
    </property> 
    </bindings> 
</bindings> 

生成ObjectFactory.createMemberType方法是不變的:

public MemberType createMemberType() { 
    return new Member(); 
} 

但是,生成Root類現在有以下實現:

protected List<myNamespace.Member> members; 
public List<myNamespace.Member> getMembers() { 
    if (members == null) { 
     members = new ArrayList<myNamespace.Member>(); 
    } 
    return this.members; 
} 

我已驗證生成的JAXB對象是正確編組和解組編碼。