JAXB可以使用XML适配器来支持这种情况。考虑您具有以下对象,没有零参数构造函数:
package blog.immutable;public class Customer { private final String name; private final Address address; public Customer(String name, Address address) { this.name = name; this.address = address; } public String getName() { return name; } public Address getAddress() { return address; }}您只需要创建此类的可映射版本:
package blog.immutable.adpater;import javax.xml.bind.annotation.XmlAttribute;import blog.immutable.Address;public class AdaptedCustomer { private String name; private Address address; @XmlAttribute public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; }}还有一个在它们之间转换的XML适配器:
package blog.immutable.adpater;import javax.xml.bind.annotation.adapters.XmlAdapter;import blog.immutable.Customer;public class CustomerAdapter extends XmlAdapter<AdaptedCustomer, Customer> { @Override public Customer unmarshal(AdaptedCustomer adaptedCustomer) throws Exception { return new Customer(adaptedCustomer.getName(), adaptedCustomer.getAddress()); } @Override public AdaptedCustomer marshal(Customer customer) throws Exception { AdaptedCustomer adaptedCustomer = new AdaptedCustomer(); adaptedCustomer.setName(customer.getName()); adaptedCustomer.setAddress(customer.getAddress()); return adaptedCustomer; }}然后,对于引用Customer类的属性,只需使用@XmlJavaTypeAdapter批注:
package blog.immutable;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;import blog.immutable.adpater.CustomerAdapter;@XmlRootElement(name="purchase-order")public class PurchaseOrder { private Customer customer; @XmlJavaTypeAdapter(CustomerAdapter.class) public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; }}有关更详细的示例,请参见:
- http://bdoughan.blogspot.com/2010/12/jaxb-and-immutable-objects.html



