如何使用JAXB编组多个对象?

use*_*722 7 java web-services jaxb

我正在尝试编组多个对象,例如Book添加到BookListsvia中setBookslst().我开始使用此JAXBContext设置:

jaxbContext = JAXBContext.newInstance(BookLists.class);
Run Code Online (Sandbox Code Playgroud)

 jaxbMarshaller.marshal(lists, result);
Run Code Online (Sandbox Code Playgroud)

但是,我得到了以下运行时异常:

javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类都知道此上下文]

我的类型定义如下.

书: -

@XmlRootElement(name="book")
public class Book {

     private String title;
     private int year;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
}
Run Code Online (Sandbox Code Playgroud)

书目清单: -

@XmlRootElement(name="lists")
public class BookLists {
List<Book> bookslst;

public List getBookslst() {
    return bookslst;
}

public void setBookslst(List bookslst) {
    this.bookslst = bookslst;
}

}
Run Code Online (Sandbox Code Playgroud)

马歇尔代码: -

Book book;
    BookLists lists=new BookLists();
    List lst=new ArrayList();
    book = new Book();
    book.setTitle("Book title");
    book.setYear(2010);
    lst.add(book);
    book = new Book();
    book.setTitle("Book title1");
    book.setYear(2011);
    lst.add(book);
    lists.setBookslst(lst);
    JAXBContext jaxbContext;
    try {
        jaxbContext = JAXBContext.newInstance(BookLists.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter result = new StringWriter();

        jaxbMarshaller.marshal(lists, result);
        String xml = result.toString();
        System.out.println(xml);
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我试图添加@XMLSeeAlso注释(参考: - JAXB异常:类不为此上下文所知).我的版本中没有此注释.

bdo*_*han 10

默认情况下,JAXB(JSR-222)实现检查公共访问器方法.您可以在get/set方法中添加Book参数List.

public List<Book> getBookslst() {
    return bookslst;
}

public void setBookslst(List<Book> bookslst) {
    this.bookslst = bookslst;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用@XmlElement注释指定属性的类型:

@XmlElement(type=Book.class)
public List getBookslst() {
    return bookslst;
}
Run Code Online (Sandbox Code Playgroud)

您还可以指定JAXB实现内省字段而不是属性:

@XmlRootElement(name="lists")
@XmlAccessorType(XmlAccessType.FIELD)
public class BookLists {
    List<Book> bookslst;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

有没有其他方法可以在Marshallar.Marshall中添加List而不是BookList?

您可以创建一个利用@XmlAnyElement(lax=true)注释的通用List包装器对象(请参阅:http: //blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html).然后它冷处理List任何注释的东西@XmlRootElement.

清单

package forum12323397;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Lists<VALUE> {

    private List<VALUE> values = new ArrayList<VALUE>();

    @XmlAnyElement(lax=true)
    public List<VALUE> getValues() {
        return values;
    }

}
Run Code Online (Sandbox Code Playgroud)

演示

package forum12323397;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Lists.class, Book.class);

        Lists<Book> lists = new Lists<Book>();

        Book book1 = new Book();
        book1.setTitle("A Book");
        book1.setYear(2001);
        lists.getValues().add(book1);

        Book book2 = new Book();
        book2.setTitle("Another Book");
        book2.setYear(2007);
        lists.getValues().add(book2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(lists, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<lists>
    <book>
        <title>A Book</title>
        <year>2001</year>
    </book>
    <book>
        <title>Another Book</title>
        <year>2007</year>
    </book>
</lists>
Run Code Online (Sandbox Code Playgroud)