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)
| 归档时间: |
|
| 查看次数: |
27303 次 |
| 最近记录: |