为什么我的ArrayList没有用JAXB编组?

时间:2010-11-11 07:41:31

标签: java xml jaxb

以下是用例:

@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 个答案:

答案 0 :(得分:15)

要编组的元素必须是公共的,或者具有XMLElement anotation。 ArrayList类和您的类Books与这些规则中的任何一个都不匹配。 您必须定义一个方法来提供Book值,并对其进行分析。

在您的代码上,只更改您的Books类,添加“自我吸气”方法:

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

(为了清晰起见,我添加了换行符)

答案 1 :(得分:2)

我认为你不能轻易地对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>

答案 2 :(得分:0)

正如@Blaise和@musiKk所指出的那样,最好只是在书籍中设置书籍列表,并允许书籍成为真正的根元素。我不认为在我自己的代码中扩展ArrayList是一个可接受的过程。