【问题标题】:JAXB Marshal for HashSet, Map, and Lists用于 HashSet、Map 和列表的 JAXB Marshal
【发布时间】:2016-04-20 17:51:08
【问题描述】:

我正在尝试将 Java bean 转换为 xml 文档,但在处理其中一些更复杂的接口时遇到了问题。这是设置:

protected Set<Object> field1;
protected Map<Integer, List<Object>> field2;
protected List<String> field3;
protected List<Object> field4;
protected List<Object> field5;
protected List<Object> field6;
protected List<String> field7;
protected List<Object> field8;

在每个对象(它本身就是一个 bean)中,我在每个类的顶部都有以下内容:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "field1",
    "field2",
    "field3",
    "field4",
    "field5",
    "field6",
    "field7",
    "field8"
})
@XmlRootElement(name = "root")

当我编组整个 bean 时,我不断收到整数和列表映射的异常。有什么我遗漏的吗?

【问题讨论】:

标签: java xml spring jaxb


【解决方案1】:

假设你有以下三个类

客户类别

package comparison;     
import java.util.ArrayList;
import java.util.List;

public class Customer {

    private long id;
    private String name;
    private Address address;
    private List<phonenumber> phoneNumbers;

    public Customer() {
        phoneNumbers = new ArrayList<PhoneNumber>();
    } 
}

地址类

package comparison;

public class Address {

    private String city;
    private String street;

}

和电话号码类

package comparison;

public class PhoneNumber {

    private String type;
    private String number;

}

现在添加一些虚拟数据

package comparison;

public class Data {

public static Customer CUSTOMER;

static {
    CUSTOMER = new Customer();
    CUSTOMER.setId(123);
    CUSTOMER.setName("Jane Doe");

    Address address = new Address();
    address.setStreet("1 A Street");
    address.setCity("Any Town");
    CUSTOMER.setAddress(address);

    PhoneNumber workPhoneNumber = new PhoneNumber();
    workPhoneNumber.setType("work");
    workPhoneNumber.setNumber("555-WORK");
    CUSTOMER.getPhoneNumbers().add(workPhoneNumber);

    PhoneNumber cellPhoneNumber = new PhoneNumber();
    cellPhoneNumber.setType("cell");
    cellPhoneNumber.setNumber("555-CELL");
    CUSTOMER.getPhoneNumbers().add(cellPhoneNumber);
} 
}

所以现在你应用编组将对象转换为 xml

package comparison.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import comparison.Customer;

import static comparison.Data.CUSTOMER;

public class JAXBDemo {

    public static void main(String[] args) throws Exception {

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        JAXBElement<Customer> jaxbElement = new JAXBElement<Customer>(new QName("customer"), Customer.class, CUSTOMER);
        marshaller.marshal(jaxbElement, System.out);
    }
}
  1. JAXBContext 需要在绑定元数据上初始化 可以发生 marshal 操作。
  2. 与 XStream 不同,JAXB 不格式化 默认情况下是 XML,因此我们将启用此功能。
  3. 没有元数据 指定我们需要为 JAXB 提供根元素名称(以及 命名空间)。

代码会产生结果:

<customer>
<id>123</id>
<address>
    <city>Any Town</city>
    <street>1 A Street</street>
</address>
<name>Jane Doe</name>
<phoneNumbers>
    <number>555-WORK</number>
    <type>work</type>
</phoneNumbers>
<phoneNumbers>
    <number>555-CELL</number>
    <type>cell</type>
</phoneNumbers>

默认情况下,JAXB 将访问公共字段和属性。您可以通过以下包级别注释配置 JAXB 以使用字段访问。

@XmlAccessorType(XmlAccessType.FIELD)
package comparison;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

你可以看看这个blogpost了解详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多