JAXB собирает коллекцию в элемент XmlElement и XmlAttribute за один шаг - PullRequest
2 голосов
/ 30 января 2010

Я бы хотел собрать коллекцию как вложенные атрибуты.

Прямо сейчас у меня есть:

@XmlElement(name="entry")
public Collection<Integer> getSizes(){ ... }

, который возвращает:

<entry>1</entry>
<entry>2</entry>

Но я бы хотел получить:

<entry id="1"/>
<entry id="2"/>

Возможно ли это без новых классов?

Ответы [ 2 ]

4 голосов
/ 30 января 2010

Кажется невозможным без новых классов вообще. Используйте XmlAdapter:

class EntryAdapter extends XmlAdapter<EntryAdapter.Entry, Integer>
{
    public EntryAdapter.Entry marshal(Integer id) {
        return new Entry(id);
    }

    public Integer unmarshal(Entry e) {
        return e.getId();
    }

    static class Entry 
    {
        private Integer id;

        public Entry() {}
        public Entry(Integer id) { this.id = id; }

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

-

@XmlElement(name="entry")  
@XmlJavaTypeAdapter(EntryAdapter.class)
public Collection<Integer> getSizes(){ ... }
2 голосов
/ 22 января 2013

Как говорится в принятом ответе, XmlAdapter - это стандартное решение JAXB.

Но если вы используете EclipseLink MOXy в качестве поставщика JAXB и можете использовать одно из его расширений, а именно @XmlPath, его можно использовать для достижения того же результата.

Чтобы упорядочить значения коллекции как атрибуты, вы используете это так:

@XmlPath("entry/@id")
public Collection<Integer> getSizes(){ ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...