我开始学习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;
}
}
有关更详细的示例,请参见:
类构造函数 类constructor是类的特殊成员函数,只要我们创建该类的新对象,就会执行该函数。 构造函数与类具有完全相同的名称,它根本没有任何返回类型,甚至无效。 构造函数对于为某些成员变量设置初始值非常有用。 下面的例子解释了构造函数的概念 - #include <iostream> using namespace std; class Line { public: voi
类构造函数 类constructor是类的特殊成员函数,只要我们创建该类的新对象,就会执行该函数。 构造函数与类具有完全相同的名称,并且根本没有任何返回类型,甚至无效。 构造函数对于为某些成员变量设置初始值非常有用。 以下示例解释了构造函数的概念 - import std.stdio; class Line { public: void setLength( double l
正如michaelpark所指出的,如果我们不想最终使用错误的构造函数,那么添加完美的转发构造函数可能会很棘手。 目前,我有一个类,它使用了一个完美的转发构造函数,因此,我需要显式声明4个构造函数:
问题内容: 我是AP Java学生,正在为考试做练习。我遇到了这个问题,但我不明白答案: 考虑以下类别: 执行以下代码后输出是什么: 正确答案是B *。有人可以向我解释方法调用的顺序吗? 问题答案: B构造函数被调用。B构造函数的第一条隐式指令是(调用超类的默认构造函数)。因此,调用了A的构造函数。A的构造函数调用,它调用java.lang.Object构造函数,该构造函数不输出任何内容。然后被称
问题内容: 为什么构造函数确实称为“构造函数”?它们的目的是什么?它们与类中的方法有何不同? 另外,一个班级中可以有更多人吗?我尝试了以下方法,有人可以解释一下结果吗? 最后,是运算符重载器吗? 问题答案: Python中没有函数重载,这意味着您不能拥有名称相同但参数不同的多个函数。 在您的代码示例中,您没有 过载 。发生的是第二个定义将名称重新 绑定到新方法,导致第一个方法不可访问。 至于关于构
类 类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。 定义类 定义一个类的一般格式为: class 类名{ private: 成员表1; public: 成员表2; protected: