2016-04-28 10 views
0

Ich erzeuge Code von einem XSD mit JAXB. Ich habe eine externe Bindungsdatei, die den Implementierungstyp für einen der XSD-Typen definiert (mit dem Attribut class/implClass). Wenn ich das tue, wird die generierte ObjectFactory geändert, um eine Instanz der angegebenen implementierenden Klasse zurückzugeben. Die generierten Klassen deklarieren jedoch weiterhin Member mit dem generierten zugrunde liegenden Typ. Gibt es eine Möglichkeit, alle Verwendungen des generierten XSD-Typs stattdessen auf meinen Implementierungstyp zu verweisen?JAXB-Bindungen ersetzen den globalen Typ mit der implementierenden Klasse

Als Beispiel sei angenommen, "example.xsd" ist wie folgt:

<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> 

Dann habe ich die folgenden "bindings.xjb" file:

<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> 

Nach xjc Laufen zu erzeugen JAXB-Klassen in dem obigen Szenario, bekomme ich eine ObjectFactory Klasse, die die folgende Methode enthält:

Die Factory generiert also korrekt eine Instanz meiner Implementierung für MemberType. Jedoch enthält die Implementierung der erzeugten Root Klasse:

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

Ich würde stattdessen wie die Umsetzung zu sein:

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

Gibt es eine Möglichkeit zu geben, dass ich MemberType mit myNamespace.Member innerhalb "ersetzen möchten bingings.xjb "? Ich würde erwarten, dass sich das Ergebnis von ObjectFactory.createMemberType aufgrund dieser Konfiguration ebenfalls ändert. Vielen Dank.

Antwort

0

Nach viel Versuch und Irrtum habe ich endlich einen Weg gefunden, dies zu tun. Das Folgende ist die Arbeit "bindings.xjb" file:

<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> 

Die erzeugte ObjectFactory.createMemberType Methode ist unverändert:

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

jedoch die erzeugte Root Klasse hat nun die folgende Umsetzung:

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

Ich habe verifiziert, dass die resultierenden JAXB-Objekte sowohl ordnungsgemäß gemarshallt als auch unmarshaliert werden.

Verwandte Themen