Jaxb2Marshaller и атрибуты - PullRequest
       11

Jaxb2Marshaller и атрибуты

3 голосов
/ 23 сентября 2010

У меня проблема с использованием Jaxb2Marshaller для демаршалинга атрибутов XML (примитивных типов).Вот пример:

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

И класс сущности:

@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;
        }
    }
}

После демаршаллинга у меня есть request.getItems (). Iterator (). Next (). GetId ()== ноль, а должно быть 1. Если я использую вложенные элементы вместо атрибутов, все работает просто отлично.Как это можно исправить?Я не хочу писать пакет XmlAdapters для всех примитивных типов Java.

1 Ответ

2 голосов
/ 25 сентября 2010

Атрибуты в XML по умолчанию не определены пространством имен их родительского элемента. Так что для

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

Элемент item имеет пространство имен foo, а атрибут id - нет.

Чтобы решить вашу проблему, вам просто нужно удалить объявление namespace из метода getId():

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