2010-07-23 4 views
5

Ich mag würde wissen, wie ich die JAXB Compiler meines XML-Schema bestimmte Elemente in als letzten in der Java-Klassendefinition deklariert werden machen machen können und ich würde auch die verschiedenen Konstrukteure in der Lage sein möge zu steuern, wie in Ich möchte einen Konstruktor, der das Objekt mit einer vollständigen Liste von Parametern, die in der Klasse enthalten sind, sowie den von JAXB benötigten privaten Konstruktor erstellen kann.JAXB Konstruktor Injektion

Irgendwelche Hilfe?

Danke. Hier

ist ein Beispiel dafür, was ich zu tun versucht:

<xs:complexType name="mycomplex"> 
    <xs:all> 
     <xs:element name="myboolean" type="xs:boolean"/> 
    </xs:all> 
</xs:complexType> 

jetzt der generierte Code so etwas wie

public class mycomplex 
{ 
     protected boolean myboolean; 

     public boolean getMyboolean() { return myboolean; } 
     public void setMyboolean(boolean b) { this.myboolean = b; } 
} 

aussehen wird, aber ich möchte das Schema bearbeiten, um es so aussehen, wie:

public class mycomplex 
{ 
     protected final boolean myboolean; 

     public mycomplex(boolean b) { this.myboolean = b; } 

     public boolean getMyboolean() { return myboolean; } 
} 

Kann dies erreicht werden?

+0

Bitte geben Sie uns Beispiele, einschließlich der Art von Schema Komponenten, über die Sie sprechen, und wie Sie diese in Java darstellen möchten. – skaffman

+0

ursprünglichen Beitrag bearbeitet. ist es möglich? – ExtremeCoder

+0

Ich glaube nicht, nein. Soweit ich weiß, wurde die Konstruktorinjektion zu JAXB2 nie hinzugefügt, obwohl ich denke, dass es an einem Punkt geplant war. – skaffman

Antwort

0

Ich habe das auf eine andere Weise gelöst. Ich erstelle ein Werkzeug, das die produzierten Java-Quellcode-Dateien bearbeitet und fügt hinzu, was ich brauche. Siehe diese für weitere Informationen: Using the Eclipse AST

0

Es gibt keine Standard-JAXB Weg, um eine Klasse zu erzeugen, die so aussieht, weil die JAXB spec nicht Mapping wie das zu einer Klasse nicht unterstützt.

Sie können den folgenden Code verwenden, um eine Set-Methode vermeiden müssen. Sie können zusätzliche Konstruktoren hinzufügen, wenn Sie möchten, solange es einen öffentlichen Standardwert gibt.

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class mycomplex  
{  
     protected final boolean myboolean;  

     public boolean getMyboolean() { return myboolean; }  
}  

Wenn Sie möchten, um die Klasse verwenden, die Sie oben mit einem Nicht-Standard-Konstruktor beschrieben und ein Feld markiert letzte Sie müssen eine XMLAdapter erstellen:

+0

Vielen Dank dafür, aber es ist nicht ganz, was ich bin Auf der Suche nach. Ich werde Hunderte von Klassen werden unmarshalling, was bedeutet, dass etwas zu tun, wie dies ziemlich langweilig sein wird, wie ich alles selbst zu definieren und diese Klassen werden alle von Zeit zu Zeit variieren -> sehr zeitaufwendig, wenn ich neu zu definieren Dinge die ganze Zeit. Gibt es eine Möglichkeit, diese Art von Verhalten in einem mehr automatisierten Prozess über Hunderte von verschiedenen Klassen hinweg aufzunehmen? Danke nochmal. – ExtremeCoder

+0

@BlaiseDoughan jede Chance, die Sie http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html zu Ihrem Moxy hinzufügen? –

+0

@AdamGent - Würde es Ihnen etwas ausmachen, dies als Kommentar zu der folgenden Verbesserungsanfrage zur Verfügung zu stellen ?: http://bugs.eclipse.org/328951 –