对于我的生活,我无法弄清楚为什么这会发生在我的代码中。
我写了一个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;
}
}
答案 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
。嗯,这并不能解释一切......