更改方法名称会添加不需要的XML块

时间:2011-06-16 18:34:39

标签: java xml jaxb

对于我的生活,我无法弄清楚为什么这会发生在我的代码中。

我写了一个java程序,将一块XML添加到现有的XML文件中。举例说明:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bookList>
   <book>
     <author>Neil Strauss</author>
     <bookName>The Game</bookName>
   </book>
</bookList>

现在,我想在bookList中添加一本书。所以我创建了一个Unmarshaller并像这样调用它:

BookMain.java:

    ArrayList<Book> bookList = new ArrayList<Book>();
    JAXBContext context = JAXBContext.newInstance(Bookstore.class);

    Unmarshaller um = context.createUnmarshaller();
    Bookstore bookstore2 = (Bookstore) um.unmarshal(new FileReader(
    "./bookstore.xml"));
    Book book3 = new Book();
    book3.setName("Test");
    book3.setAuthor("TestAuthor");

    bookstore2.getBooksList().add(book3);

    Marshaller map = context.createMarshaller();
    map.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    map.marshal(bookstore2, System.out);

Bookstore.java:

@XmlRootElement(name = "bookList")

public class Bookstore {


    // XmlElement sets the name of the entities
    @XmlElement(name = "book")
    private ArrayList<Book> bookList;

    public void setBookList(ArrayList<Book> bookList) {
        this.bookList = bookList;
    }

    public ArrayList<Book> getBooksList() {
        return bookList;
    }
}

这很好用。它在书单中添加了一本书没问题。但后来我改变了两个方法,setBookList和getBookList为setBList和getBList,突然,输出如下:

<bookList>
    <book>
        <author>Neil Strauss</author>
        <bookName>The Game</bookName>
    </book>
    <book>
        <author>TestAuthor</author>
        <bookName>Test</bookName>
    </book>
    <BList>
        <author>Neil Strauss</author>
        <bookName>The Game</bookName>
    </BList>
    <BList>
        <author>TestAuthor</author>
        <bookName>Test</bookName>
    </BList>
</bookList>

为什么更改方法名称会添加这些不需要的XML块,如何修复它以便我可以更改此方法名称而不会产生不必要的后果?

编辑以下是请求的Book.java

@XmlRootElement(name = "book")
// If you want you can define the order in which the fields are written
// Optional
@XmlType(propOrder = { "author", "name" })
public class Book {

    private String name;
    private String author;

    // If you like the variable name, e.g. "name", you can easily change this
    // name for your XML-Output:
    @XmlElement(name = "bookName")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

}

3 个答案:

答案 0 :(得分:2)

JAXB默认为@XmlAcessorType(XmlAcessType.PUBLIC)。这意味着它将映射所有公共访问者/字段以及带注释的字段。当字段的名称与访问者匹配时,JAXB认识到它们是相关的。当你更改名称时,它没有。要解决此问题,您可以注释访问者或使用XmlAccesssType.FIELD。

答案 1 :(得分:0)

这是第二次运行,所以您是否验证输入文件/流不是上次输出文件/流的保存副本?如果没有,那么您可能会将两本书添加(如代码所示)到已经包含两本书的书籍列表中。

答案 2 :(得分:0)

至少问题与向BookList添加Book无关。我想原因在于@XmlRootElement(name = "bookList")和成员变量private ArrayList<Book> bookList;的同名。

看看你的吸气者:

public ArrayList<Book> getBooksList() {return bookList;}

如果您将其重命名为标准方法名称getBookList(),则会立即获得IllegalAnnotationsException。嗯,这并不能解释一切......