Почему мой ArrayList не распакован с JAXB? - PullRequest
17 голосов
/ 11 ноября 2010

Вот пример использования:

@XmlRootElement
public class Book {
  public String title;
  public Book(String t) {
    this.title = t;
  }
}
@XmlRootElement
@XmlSeeAlso({Book.class})
public class Books extends ArrayList<Book> {
  public Books() {
    this.add(new Book("The Sign of the Four"));
  }
}

Затем я делаю:

JAXBContext ctx = JAXBContext.newInstance(Books.class);
Marshaller msh = ctx.createMarshaller();
msh.marshal(new Books(), System.out);

Вот что я вижу:

<?xml version="1.0"?>
<books/>

Гдемои книги?:)

Ответы [ 3 ]

16 голосов
/ 11 ноября 2010

Элементы, подлежащие маршалированию, должны быть общедоступными или иметь аннотацию XMLElement. Класс ArrayList и ваши классы Books не соответствуют ни одному из этих правил. Вы должны определить метод для предложения значений Book и аннотировать его.

В вашем коде, изменив только свой класс Books, добавив метод "self getter":

@XmlRootElement
@XmlSeeAlso({Book.class})
public class Books extends ArrayList<Book> {
  public Books() {
    this.add(new Book("The Sign of the Four"));
  }

  @XmlElement(name = "book")
  public List<Book> getBooks() {
    return this;
  }
}

когда вы запустите свой код сортировки, вы получите:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books><book><title>The Sign of the Four</title></book></books>

(для ясности я добавил разрыв строки)

2 голосов
/ 11 ноября 2010

Не думаю, что вы легко можете набрать List как есть.Подумайте об использовании другого класса, чтобы обернуть список. Следующие работы:

@XmlType
class Book {
    public String title;

    public Book() {
    }

    public Book(String t) {
        this.title = t;
    }
}

@XmlType
class Books extends ArrayList<Book> {
    public Books() {
        this.add(new Book("The Sign of the Four"));
    }
}

@XmlRootElement(name = "books")
class Wrapper {
    public Books book = new Books();
}

Используется следующим образом:

JAXBContext ctx = JAXBContext.newInstance(Wrapper.class);
Marshaller msh = ctx.createMarshaller();
msh.marshal(new Wrapper(), System.out);

это дает такой результат:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books><book><title>The Sign of the Four</title></book></books>
0 голосов
/ 01 ноября 2012

Как отметили @Blaise и @musiKk, было бы лучше просто иметь список книг в книгах и позволить книгам быть истинным корневым элементом.Я бы не считал расширение ArrayList приемлемой процедурой в своем собственном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...