领域模型
在此示例中,我将使用以下域模型。 注意如何没有任何类型的注释。
顾客
在此示例中, 客户是根对象。 通常,我们将使用@XmlRootElement对其进行注释 。 稍后在演示代码中,您将看到我们如何使用JAXBElement实例。
package blog.defaults;
import java.util.List;
public class Customer {
private String firstName;
private String lastName;
private List<PhoneNumber> phoneNumbers;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<PhoneNumber> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
}
电话号码
我有目的地给了此类中的字段废话名称,以便稍后在查看XML时,您将能够看到默认情况下元素名称是从属性而不是字段派生的。
package blog.defaults;
public class PhoneNumber {
private String foo;
private String bar;
public String getType() {
return foo;
}
public void setType(String type) {
this.foo = type;
}
public String getNumber() {
return bar;
}
public void setNumber(String number) {
this.bar = number;
}
}
示范代码
由于我们没有使用@XmlRootElement (或@XmlElementDecl )将根元素与Customer类相关联,因此我们需要告诉JAXB我们要将XML文档解组到哪个类。 这可以通过使用采用Class参数(第14行)的解组方法之一来完成。 这将返回J AXBElement ,然后通过在其上调用getValue来访问Customer对象(第15行)。 为了将对象封送回XML,我们需要确保将其包装在JAXBElement中以提供根元素信息(第17行)。
package blog.defaults;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
StreamSource xml = new StreamSource("src/blog/defaults/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Customer> je1 = unmarshaller.unmarshal(xml, Customer.class);
Customer customer = je1.getValue();
JAXBElement<Customer> je2 = new JAXBElement<Customer>(new QName("customer"), Customer.class, customer);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(je2, System.out);
}
}
input.xml /输出
以下是运行演示代码的输入和输出。 我们首先看到的是,它是数据的非常合理的XML表示形式,没有任何JAXB工件。 默认情况下,JAXB将所有内容封送为XML元素,根据PhoneNumber类,我们看到元素名称是从属性名称派生的。
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<firstName>Jane</firstName>
<lastName>Doe</lastName>
<phoneNumbers>
<number>555-1111</number>
<type>work</type>
</phoneNumbers>
<phoneNumbers>
<number>555-2222</number>
<type>home</type>
</phoneNumbers>
</customer>
进一步阅读
如果您喜欢这篇文章,那么您可能也会对以下内容感兴趣:
- 该博客上的大多数文章都描述了如何利用JAXB元数据的功能来支持不同的用例,我邀请您检查一下它们:
- 如果您有兴趣在不使用批注的情况下指定元数据,则可能对EclipseLink JAXB(MOXy)的外部映射文档感兴趣:
参考: JAXB – Java XML和JSON绑定博客中的JCG合作伙伴 Blaise Doughan 不需要注释 。
翻译自: https://www.javacodegeeks.com/2012/07/jaxb-no-annotations-required.html