2010-07-23 5 views
5

Je voudrais savoir comment je peux faire en sorte que le compilateur JAXB fasse en sorte que certains éléments de mon schéma XML soient déclarés comme définitifs dans la définition de classe java et je voudrais aussi pouvoir contrôler les différents constructeurs, comme dans Je voudrais un constructeur qui pourrait créer l'objet avec une liste complète de paramètres contenus dans la classe ainsi que le constructeur privé par défaut requis par JAXB.JAXB constructor injection

Une aide?

Merci.

Voici un exemple de ce que je suis en train de faire:

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

maintenant le code généré ressemblera à quelque chose comme

public class mycomplex 
{ 
     protected boolean myboolean; 

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

mais je voudrais modifier le schéma pour le faire paraître comme:

public class mycomplex 
{ 
     protected final boolean myboolean; 

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

     public boolean getMyboolean() { return myboolean; } 
} 

Est-ce que cela peut être réalisé?

+0

S'il vous plaît nous donner des exemples, y compris le type de schéma les composants dont vous parlez, et comment vous voulez les représenter en java. – skaffman

+0

publication originale modifiée. c'est possible? – ExtremeCoder

+0

Je ne pense pas que ce soit, non. À ma connaissance, l'injection de constructeurs n'a jamais été ajoutée à JAXB2, même si je pense que c'était prévu à un moment donné. – skaffman

Répondre

0

J'ai résolu cela d'une autre manière. Je crée un outil qui éditera les fichiers de code source java produits et ajoutera/enlèvera ce dont j'ai besoin. Reportez-vous à cela pour plus d'informations: Using the Eclipse AST

0

Il n'existe pas de méthode JAXB standard pour générer une classe qui ressemble à cela, car la spécification JAXB ne prend pas en charge le mappage vers une classe de ce type.

Vous pouvez utiliser le code suivant pour éviter d'avoir une méthode définie. Vous pouvez ajouter des constructeurs supplémentaires si vous le souhaitez tant qu'il existe un constructeur par défaut.

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

Si vous voulez utiliser la classe que vous avez décrite ci-dessus avec un constructeur non défini par défaut et un champ marqué final, vous devrez créer un XMLAdapter:

+0

Merci beaucoup pour ça mais ce n'est pas tout à fait ce que je suis à la recherche de. Je vais démêler des centaines de classes, ce qui signifie que faire quelque chose comme ça va être assez fastidieux car je dois tout définir moi-même et ces classes vont tous varier de temps en temps -> beaucoup de temps si je dois redéfinir les choses tout le temps. Existe-t-il un moyen d'intégrer ce type de comportement dans un processus plus automatisé à travers des centaines de classes différentes? Merci encore. – ExtremeCoder

+0

@BlaiseDoughan avez-vous une chance d'ajouter http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html à votre Moxy? –

+0

@AdamGent - Pourriez-vous fournir ceci comme commentaire sur la demande d'amélioration suivante ?: http://bugs.eclipse.org/328951 –