我开始学习JAXB,所以我的问题可能很愚蠢。现在我有了类,想要生成XML Schema。在执行此指令后,我得到了异常
IllegalAnnotationExceptions …没有无参数的默认构造函数。
是的 我的课程没有默认的无参数构造函数。太容易了 我有类与包可见的构造函数/ final方法和偏离路线的参数。我应该怎么做-创建一些特定的momemto / builder类或将我的构造函数指定为JAXB(以什么方式?)?谢谢。
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; } }
有关更详细的示例,请参见: