2016-06-17 15 views
0

Ich verwende das JAXB xjc Befehlszeilentool, um ein XML-Schema (.xsd-Datei) in Java-Objekte zu konvertieren.Wie kann ich bei der Generierung von Java-Klassen mit JAXB ein benutzerdefiniertes Feld zu jeder Klasse hinzufügen?

Hier sind die Inhalte meiner XSD-Datei:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="ownerDog"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="owner" type="xs:string" /> 
      <xs:element name="dog" type="xs:string"/> 
      <xs:element name="toy" type="toyType"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="toyType"> 
    <xs:sequence> 
     <xs:element name="color" type="xs:string" /> 
     <xs:element name="price" type="xs:integer" /> 
    </xs:sequence> 
</xs:complexType> 

</xs:schema> 

Als ich .xsd laufen, bekomme ich drei Klassen: OwnerDog.java, ToyType.java und ObjectFactory.java.

Ich möchte OwnerDog.java und ToyType.java ein benutzerdefiniertes Feld hinzufügen. Dieses Feld wird eine Referenz zu einer Buchhaltungsklasse sein, die ich verwenden werde, um Statistiken für jeden Knoten in meinem XML-Baum zu verfolgen.

Zum Beispiel ist dies der Code, den ich für ToyType.java erhalten:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "toyType", propOrder = { 
    "color", 
    "price" 
}) 
public class ToyType { 

    @XmlElement(required = true) 
    protected String color; 
    @XmlElement(required = true) 
    protected BigInteger price; 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String value) { 
     this.color = value; 
    } 

    public BigInteger getPrice() { 
     return price; 
    } 

    public void setPrice(BigInteger value) { 
     this.price = value; 
    } 

} 

Ich mag es so aussehen:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "toyType", propOrder = { 
    "color", 
    "price" 
}) 
public class ToyType { 

    private BookKeeper bk; 

    @XmlElement(required = true) 
    protected String color; 
    @XmlElement(required = true) 
    protected BigInteger price; 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String value) { 
     this.color = value; 
    } 

    public BigInteger getPrice() { 
     return price; 
    } 

    public void setPrice(BigInteger value) { 
     this.price = value; 
    } 

} 

Gibt es eine Möglichkeit Felder JAXB hinzufügen -generated Klassen programmgesteuert? Offensichtlich ist es für mein Beispiel leicht, es manuell zu machen, aber das ist nur ein Übungsproblem für ein viel größeres Produktionsproblem.

Ich bin nicht in der Lage, die ursprüngliche .xsd-Datei zu ändern, und ich brauche dies für mehrere .xsd-Dateien, die ich noch nicht gesehen haben.

Antwort

0

Es ist ein bisschen chaotisch, aber ich konnte dies mit einer kleinen Bash-Skript auszuführen:

xjc -p com.company.ustruc_to_xml OwnerDog.xsd 
cd ./com/company/ustruc_to_xml 
for f in *.java; do sed -i 's/\(^public class .*$\)/\1\n\n private BookKeeper bk;/' $f; done 
cp *.java /Users/car/Documents/workspace/proj_ustruc_to_xml/src/com/ibm/ustruc_to_xml 
0

Ich weiß nicht, eine Möglichkeit, die benutzerdefinierten Felder mit JAXB zu erstellen.

Ich würde Ihnen empfehlen, versuchen Sie, die Struktur des Projekts zu ändern. Ich würde einen Typ erstellen, der die Datenvariable JAXB (ToyType oder OwnerDog) enthält und auch die BookKeeper enthält. Es kann ein abgeleiteter Typ sein.

Ändern Sie den generierten JAXB Code manuell kann die Dinge schwieriger machen, wenn Ihr System oder Ihr Entwicklungsteam größer wird.