2011-06-16 4 views
2

私の人生にとって、なぜこのことが自分のコードで起こっているのか分かりません。メソッド名を変更すると不要なXMLブロックが追加される

私は、既存のXMLファイルにXMLブロックを追加するJavaプログラムを作成しました。例:

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

ここで、bookListにブックを追加します。だから私は、Unmarshallerのを作成し、そのようにそれを呼び出す:これは正常に動作します

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

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を。それは問題なしで本の中に本を追加します。しかし、その後、私はsetBListとgetBListに二つの方法、setBookListとgetBookListを変更すると、突然、出力は次のようになります。

<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のこれらの不要なブロックを追加メソッド名を変更し、どのように私はそれを修正するだろう私はこのメソッド名を不要な結果なしに変更できますか?

@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

あなたは 'Book.java'を提供できますか? – Thor

+0

私は自分の回答を編集し、あなたが要求したとおりに追加しました。 – Otra

+0

出力を確認できます。興味深い質問! – Thor

答えて

2

デフォルトでは@XmlAcessorType(XmlAcessType.PUBLIC)です。これは、すべてのパブリックアクセサ/フィールドと注釈付きフィールドをマッピングすることを意味します。フィールドの名前がアクセサーJAXBと一致すると、それらは関連していました。あなたが名前を変更したとき、それはしませんでした。この問題を解決するには、アクセサに注釈を付けるか、XmlAccesssType.FIELDを使用します。

+0

これはなぜgetBookList()が問題を修正する直前に '@XmlElement(name =" book ")'を追加するのかを説明していますか? – Otra

0

を要求したとして、ここでは

編集がBook.javaがあるそれはあなたがあなたの入力ファイル/ストリームは、あなたの最後の出力ファイル/ストリームの保存されたコピーではなかったことを確認した、セカンドランです?そうでない場合は、2つの書籍がすでに含まれている書籍のリストに2つの書籍を追加する必要があります(コードのように)。

+0

メソッド名を元に戻して3回目を実行すると、bookListに2つのブックブロックがあり、2つのBListブロックがどこに見えないのかが正しく見えます。 – Otra

+0

初めて変更したときは、コピーしてから変更しましたか?もしそうなら、おそらく古いコピーを同じ環境に残しました。 –

+0

また、保存されていたとしても、xmlタグはメソッドの名前のように 'book'から' BList'に変更されるのはなぜですか? – Otra

0

少なくとも、問題はbookListにブックを追加することとは独立しています。その理由は、@XmlRootElement(name = "bookList")という同じ名前のメンバー変数private ArrayList<Book> bookList;にあると考えられます。

は、あなたのゲッターを見てみましょう:

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

あなたはすぐにIllegalAnnotationsExceptionを得る標準メソッド名getBookList()に名前を変更した場合。これはすべてを説明するものではありません。

+0

こんにちは!さらなる調査の後、別の理論があると思います。私のBookStore.javaメソッドの '@XmlElement(name =" book ")はgetBooksList()メソッドの真上にあるはずです。注釈をそこに移すと、名前は同じになる可能性があり、コードを実行することはできません。 – Otra

関連する問題