2010-09-23 8 views
3

J'ai un problème lors de l'utilisation de Jaxb2Marshaller pour les attributs XML unmarshalling (de types primitifs). Voici l'exemple:Jaxb2Marshaller et attributs

<?xml version="1.0" encoding="UTF-8"?> 
<request xmlns="..."> 
    <items> 
     <item id="1"/> 
     <item id="2"/> 
     <item id="3"/> 
    </items> 
</request> 

Et la classe d'entité est:...

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlRootElement(name = "request", namespace = "...") 
@XmlType(name = "Request", namespace = "...") 
public class Request { 

    private List<Item> _items; 

    @XmlElementWrapper(name = "items", namespace = "...") 
    @XmlElement(name = "item", namespace = "...") 
    public List<Item> getItems() { 
     return _items; 
    } 

    public void setItems(List<Item> items) { 
     _items= items; 
    } 

    @XmlType(name = "Item", namespace = "...") 
    public static class Item { 

     private Long _id; 

     @XmlAttribute(name = "id", namespace = "...") 
     public Long getId() { 
      return _id; 
     } 

     public void setId(Long id) { 
      _id = id; 
     } 
    } 
} 

Après unmarshalling je request.getItems() iterator() suivant() getId() == null alors que cela devrait être 1. Si j'utilise des éléments imbriqués à la place des attributs, tout fonctionne correctement. Comment cela pourrait-il être réparé? Je ne veux pas écrire un lot de XmlAdapters pour tous les types Java primitifs.

Répondre

2

Par défaut, les attributs XML ne sont pas qualifiés avec l'espace de nom de leur élément parent. Donc, pour

<item id="3" xmlns="foo"/> 

L'élément item a l'espace de noms foo, mais l'attribut id ne fonctionne pas.

Pour résoudre votre problème, vous devez juste besoin de supprimer la déclaration namespace de la méthode getId():

@XmlAttribute(name = "id") 
public Long getId() { 
    return _id; 
} 
+0

Merci. Il a résolu le problème. – Vladimir