JAXB puede admitir este caso utilizando un adaptador XML. Considere usted tiene el siguiente objeto con ningún constructor cero-arg:
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;
}
}
Usted sólo tendrá que crear una versión mapeable de esta clase:
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;
}
}
y un adaptador de XML para convertir entre ellos:
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;
}
}
continuación para las propiedades que se refiere a la clase de cliente, basta con utilizar la anotación @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;
}
}
Para un ejemplo más detallado, véase:
por favor no copie los enlaces directamente, explique los conceptos básicos en su respuesta, y eventualmente enlace a la publicación del blog si se necesita más explicación. De esta forma, si el enlace cae muerto, todavía tendremos la respuesta. –
Esto es lo que necesito gracias. –
Estoy de acuerdo no solo con copiar enlaces. Esta respuesta se publicó durante mi viaje al trabajo desde mi teléfono. Proporcionaré más detalles cuando estoy en una computadora. El enlace es a mi propio blog si eso ayuda –