2017-03-17 5 views
0

J'ai soigneusement étudié la discussion "JAXB Adding attributes..." et voudrais aller un peu plus loin.JAXB - Ajouter les mêmes attributs à différents éléments

Par exemple, il y a une classe suivante:

@XmlRootElement(name = "company") 
@XmlType(propOrder = {"id", "name", "address"}) 
public class Company { 

    private String id; 
    private String name; 
    private String address; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @XmlElement(name = "name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @XmlElement(name = "address") 
    public String getAddress() { 
     return name; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

Après marshaling un objet, nous avons:

<company> 
    <id>1</id> 
    <name>Abc</name> 
    <address>Mountain View, United States</address> 
</company> 

Y at-il une solution élégante, - par exemple en utilisant des annotations @XmlPaths, @XmlPath, @XmlElements , @XmlElement, - A recevoir comme résultat:

<company> 
    <id>1</id> 
    <name lang="en">Abc</name> 
    <address lang="en">Mountain View, United States</address> 
</company> 
+0

quel est le problème avec la solution dans le lien que vous avez fourni. – ulab

+0

Si vous utilisez MOXy, consultez http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html. –

Répondre

1

Que diriez-vous de créer une chaîne personnalisée avec l'attribut lang et utiliser à la place de la chaîne

par exemple:

public class LangString { 

    @XmlValue 
    protected String value; 
    @XmlAttribute(name = "lang") 
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    @XmlSchemaType(name = "language") 
    protected String lang; 

    //GETTERS & SETTERS 
} 

Votre code:

@XmlRootElement(name = "company") 
@XmlType(propOrder = {"id", "name", "address"}) 
public class Company { 

    private String id; 
    private LangString name; 
    private LangString address; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @XmlElement(name = "name") 
    public LangString getName() { 
     return name; 
    } 

    public void setName(LangString name) { 
     this.name = name; 
    } 

    @XmlElement(name = "address") 
    public LangString getAddress() { 
     return name; 
    } 

    public void setAddress(LangString address) { 
     this.address = address; 
    } 
} 

Le code ci-dessus a été généré à partir d'un xsd schéma pour mon application qui avait des éléments avec l'attribut lang ainsi le @XmlSchemaType.

Espérons que cela aide

+0

Oui, mais que faire si vous devez ajouter un attribut à de nombreux éléments xml qui ne sont pas des objets (classes). Il faudrait écrire une classe pour chacun d'entre eux, ce qui rend cette solution impraticable. –

+0

Vous voulez dire un attribut avec un nom différent? – stevengatsios

+0

Non, je veux dire un attribut avec le même nom. Par exemple, dans l'exemple OP, l'attribut lang doit être associé aux champs nom et adresse. Cependant, en utilisant votre suggestion, vous devrez créer deux nouvelles classes (par exemple AddressLang et NameLang respectivement), dont chacune aurait un attribut nommé lang. Cela fonctionne mais est impraticable. En outre, dans ce scénario, il n'est pas nécessaire d'étendre XmlAdapter. –