2010-01-21 4 views
3

Vous ne savez pas si le titre a un sens. J'ai un objet que je veux maréchal en utilisant JAXB qui ressemble à ceci:Marquage d'un objet comportant des zones d'objet

@XmlRootElement(name = "subscriptionRequest") 
    public class RegistrationRequest { 

    private Long id; 
    private RegistrationSource registrationSource; 
    } 

L'objet RegistrationSource:

public class RegistrationSource { 

    private Integer id; 
    private String code; 
} 

Je veux créer un fichier XML qui a la mise en page suivante:

Où la valeur de l'attribut registrationSource est la valeur du champ de code de l'objet RegistrationSource.
<subscriptionRequest registrationSource="0002"> 
    ... 
</subscriptionRequest> 

De quelles annotations xml ai-je besoin?

Répondre

6

@XmlAttribute sur registrationSource, @XmlValue sur code. Notez que dans ce cas, vous devriez également avoir @XmlTransient sur d'autres domaines de RegistrationSource, tels que id

EDIT: Cela fonctionne:

@XmlRootElement(name = "subscriptionRequest") 
public class RegistrationRequest { 

    private Long id; 
    private RegistrationSource registrationSource; 

    public Long getId() { return id; } 
    public void setId(Long id) { this.id = id; } 

    @XmlAttribute 
    public RegistrationSource getRegistrationSource() { return registrationSource; } 
    public void setRegistrationSource(RegistrationSource registrationSource) 
    { 
     this.registrationSource = registrationSource; 
    } 
} 

-

public class RegistrationSource { 

    private Integer id; 
    private String code; 

    @XmlTransient 
    public Integer getId() { return id; } 
    public void setId(Integer id) { this.id = id; } 

    @XmlValue 
    public String getCode() { return code; } 
    public void setCode(String code) { this.code = code; } 
} 
+0

Je reçois l'exception suivante: Exception dans le thread « principal » com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 compte de IllegalAnnotationExceptions @XmlValue ne sont pas admis sur un classe qui dérive une autre classe. – Imhotep

+0

@Imhotep: J'ai ajouté le code de travail. – axtavt

+0

Avant d'écrire ce code, j'ai mis les annotations sur la déclaration des champs. Après avoir vu votre code et appliqué les changements, je reçois ces: Exception dans le fil "principal" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 5 chefs d'IllegalAnnotationExceptions @XmlValue n'est pas autorisé sur une classe qui dérive une autre classe. . Si une classe a la propriété @XmlElement, elle ne peut pas avoir de propriété @XmlValue. . @ XmlAttribute/@ XmlValue doit faire référence à un type Java mappé au texte en XML. . La classe a deux propriétés du même nom "registrationSource" . La classe a deux propriétés du même nom "code" – Imhotep

0

L'approche boiteuse serait ajouter quelque chose comme

@XmlAttribute(name = "registrationSource") 
private String getCode() { 
    return registrationSource.code; 
} 

à votre RegistrationSource - mais il doit y avoir une façon plus élégante ...

+0

Celui-ci fonctionne, mais comme vous le dites, il est un peu boiteux. J'attendrai des réponses aux autres suggestions et si aucune autre solution possible n'est donnée, je marquerai ceci comme accepté. Merci ps: c'est comme la deuxième solution sb mentionnée avant vous, mais il semble qu'il a effacé son post. – Imhotep

+0

Je dois noter que dans cette occasion je dois aussi mettre l'annotation @XmlTransient sur l'objet registrationSource, de sorte qu'il n'apparaisse pas aussi en tant qu'élément. – Imhotep

1

Si vous voulez générer cette classe automatiquement à l'aide des outils, essayez ceci - Generate xsd à partir de votre XML en utilisant des outils tels que Trang, et puis générer le fichier java à partir de xsd en utilisant jaxb. La vie serait beaucoup plus simple :)