bdo*_*han 42
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您只需要创建此类的可映射版本:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
和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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,对于引用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;
}
}
Run Code Online (Sandbox Code Playgroud)
有关更详细的示例,请参阅:
Raf*_*l M 14
您可以使用注释@XmlType并以各种组合使用factoryMethod/factoryClass属性,例如:
@XmlType(factoryMethod="newInstance")
@XmlRootElement
public class PurchaseOrder {
@XmlElement
private final String address;
@XmlElement
private final Customer customer;
public PurchaseOrder(String address, Customer customer){
this.address = address;
this.customer = customer;
}
private PurchaseOrder(){
this.address = null;
this.customer = null;
}
/** Creates a new instance, will only be used by Jaxb. */
private static PurchaseOrder newInstance() {
return new PurchaseOrder();
}
public String getAddress() {
return address;
}
public Customer getCustomer() {
return customer;
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这有效,并且在解组时会获得初始化的实例.您应该注意不要newInstance在代码的任何位置调用该方法,因为它将返回无效的实例.
您应该有一个JAXB的默认构造函数,以便能够实例化您的类.也许有一个我不知道的解决方法.
JAXB特别适合类似bean的类,允许通过调用它们上的setter来配置对象.
| 归档时间: |
|
| 查看次数: |
25558 次 |
| 最近记录: |