2011-11-13 1 views
1

J'ai un problème avec mon JAXB. J'ai une méthode avec @XmlAnyAttribute (sur mon getter) mais cela ne semble pas fonctionner avec le setter (en utilisant JAXB RI si c'est important).Bug avec @XmlAnyAttribute et méthodes? (en utilisant JAXB RI)

Code simplifié:

@XmlRootElement(name = "element") 
@XmlAccessorType(value = XmlAccessType.PUBLIC_MEMBER) 
public class Element 
{ 
    private Map<QName, String> convertedAttributes = new HashMap<QName, String>(); 

    private List<Attribute> attributes = new ArrayList<Attribute>(); 

    @XmlAnyAttribute 
    public Map<QName, String> getConvertedAttributes() throws Exception 
    { 
     if (attributes != null) 
     { 
      return new AttributeMapAdapter().marshal(attributes); 
     } 

     return new HashMap<QName, String>(); 
    } 

    public void setConvertedAttributes(Map<QName, String> convertedAttributes) 
    { 
     this.convertedAttributes = convertedAttributes; 
    } 

    @XmlTransient 
    public List<Attribute> getAttributes() 
    { 
     return attributes; 
    } 

    public void setAttributes(List<Attribute> attributes) 
    { 
     this.attributes = attributes; 
    } 
} 

Ce grand travail pour permettre le rassemblement, et je reçois la sortie que je veux. Mais quand j'essaye de le démasquer, aucune valeur n'est envoyée au setter.

J'ai essayé de déplacer l'annotation @XmlAnyAttribute dans le champ, et cela fonctionne bien (mais je ne peux pas faire l'adaptation dans le getter).

Cela ressemble un peu à un bug, mais je ne suis pas sûr. Des idées? J'utilise Java 1.6 sur Mac OS X (10.7.2)

+0

Je peux fournir plus de code si nécessaire. – mortenoh

Répondre

1

Ce n'est pas un bug dans le JAXB RI. Le problème est dans votre méthode getConvertedAttributes(). Ce qui suit fonctionne un peu mieux:

public Map<QName, String> getConvertedAttributes() throws Exception 
{ 
    if(!convertedAttributes.isEmpty()) { 
     return convertedAttributes; 
    } 
    if (attributes != null) { 
     convertedAttributes = new AttributeMapAdapter().marshal(attributes); 
    } else { 
     convertedAttributes = new HashMap<QName, String>(); 
    } 
    return convertedAttributes; 
} 
+0

Ok, merci .. – mortenoh

0

Votre setter doit de nouveau annuler la carte. Vous avez donc besoin d'un adaptateur pour l'autre direction.

+0

J'ai un mapper pour cette direction. Mais convertedAttributes est toujours vide, il n'obtient aucune valeur. Utiliser @XmlAnyAttribute sur le champ me donne des valeurs à unmarshall, mais l'utiliser sur la méthode ne fonctionne pas. – mortenoh

+0

@mortenoh ouais tu as raison, il utilisera seulement le getter pour accéder à la carte sous-jacente. Vous devrez décorer la carte retournée du getter et intercepter les méthodes put et get de là. Je suggérerais de faire en sorte que votre adaptateur actuel implémente l'interface de la carte et la renvoie. – Omnaest

Questions connexes