2010-08-15 5 views
3

j'ai une définition xsd (de www.tmforum.org ossj v1.5 api commun)XSD anyType et JAXB

<element name="primaryKey" nillable="false"> 
    <complexType mixed="false">     
     <complexContent mixed="false"> 
     <extension base="anyType"/>     
     </complexContent> 
    </complexType> 
</element> 

et souhaitez générer un fichier XML comme suit

<ossj-co-v1-5:primaryKey>mykey</ossj-co-v1-5:primaryKey> 

Le La classe PrimaryKey générée à partir de xsd en utilisant xjc nécessite qu'un élément DOM soit stocké dans une liste (voir la classe PrimaryKey générée en bas "." MyKey "est un TextNode et puisque ce n'est pas un élément DOM, il ne peut pas être ajouté à xjc Classe PrimaryKey générée Comment dois-je procéder pour obtenir la sortie requise?

Voici la classe PrimaryKey générée à partir du xsd

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
    "any" 
    }) 
public static class PrimaryKey { 

    @XmlAnyElement 
    protected List<Element> any; 
    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    public List<Element> getAny() { 
     if (any == null) { 
      any = new ArrayList<Element>(); 
     } 
     return this.any; 
    } 


    public Map<QName, String> getOtherAttributes() { 
     return otherAttributes; 
    } 

} 
+0

Quel type de valeurs de propriété avez-vous besoin de la propriété any, et êtes-vous d'accord avec les solutions qui impliquent de modifier manuellement le modèle généré? –

+0

Il devrait juste contenir une valeur de chaîne. Je ne veux pas modifier manuellement les classes générées car elles sont générées à la compilation. L'extension des classes générées ou l'utilisation de liaisons xjb devrait être bonne. Mais je cherche des exemples. –

Répondre

3

Les modèles d'objets suivants fonctionneraient pour votre scénario. Je vais essayer de déterrer les personnalisations de schéma appropriées pour produire ces modèles d'objets.

Option 1

Vous pourriez avoir votre look de code comme suit. Cela signifierait que l'élément "primaryKey" entraînerait l'instanciation de l'objet PrimaryKey avec le contenu textuel correspondant défini sur la propriété any.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {"any" }) 
public static class PrimaryKey { 

    @XmlValue 
    protected String any; 

    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    public List<Element> getAny() { 
     if (any == null) { 
      any = new ArrayList<Element>(); 
     } 
     return this.any; 
    } 


    public Map<QName, String> getOtherAttributes() { 
     return otherAttributes; 
    } 

} 

Option # 2

Si vous voulez un objet extérieur d'avoir une propriété de chaîne correspondant au primaryKey vous pourriez faire ce qui suit:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    // @XmlElement is implied 
    private String primaryKey; 

} 
1

L'option # 1 getAny () ne peut pas renvoyer String lorsque la signature renvoie List.

L'option fonctionne en effet. Merci!

Voici comment ma modification du code OSSJ ressemble:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ManagedEntityKey", propOrder = { 
    "applicationContext", 
    "applicationDN", 
    "type", 
    "primaryKey" 
}) 
public class ManagedEntityKey { 
    @XmlElement(required = true) 
    protected String primaryKey; 
    //protected ManagedEntityKey.PrimaryKey primaryKey; 

Et ofcourse la signature des setters et getters devrait être modifié.

+0

Est-ce que cela a fonctionné pleinement pour vous? Je rencontre le même problème mais quand je fais comme vous - même en faisant les setters et les getters - il casse maintenant les choses - oui, je peux obtenir la valeur d'un tag clé primaire mais l'attribut "type" est maintenant parti – JGlass