因此,我一直在阅读在JAXB here中使用ID和IDREF的内容,在所示示例中,它们使用了1个IDREF元素,该元素在生成的Java代码中显示为对象。我同时包括了XML模式...
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="id" type="xsd:ID"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="OrderType">
<xsd:sequence>
<xsd:choice>
<xsd:element name="customer" type="CustomerType"/>
<xsd:element name="custref" type="xsd:IDREF"/>
</xsd:choice>
<xsd:element name="items" type="ItemType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
和后代的Java代码。
public class OrderType {
protected CustomerType customer;
protected Object custref;
protected List items;
public CustomerType getCustomer() {
return customer;
}
public void setCustomer(CustomerType value) {
this.customer = value;
}
public Object getCustref() {
return custref;
}
public void setCustref(Object value) {
this.custref = value;
}
public List getItems() {
if (items == null) {
items = new ArrayList();
}
return this.items;
}
}
现在,在我的代码中,我尝试了一些不同的操作,以以下模式为例:
<xsd:complexType name="SimViewType">
<xsd:sequence>
<xsd:element name="NAME" type="xsd:string"></xsd:element>
<xsd:element name="ITEM" type="am:SimItemIDREF" minOccurs="0" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID" use="required"></xsd:attribute>
</xsd:complexType>
<xsd:simpleType name="SimItemIDREF">
<xsd:restriction base="xsd:IDREF"></xsd:restriction>
</xsd:simpleType>
尽管我已经在SimItemIDREF中包含了通用IDREF,但这只是为了提高可读性。但是,即使我改用普通的xsd:IDREF,我使用非1的简单事实也意味着我的Java代码以以下内容结束...
public class SimViewType {
...
protected List<JAXBElement<Object>> item;
...
}
我得到的是
List<Object>
而不是List<JAXElement<Object>>
。现在,如果我想制作一个JAXElement,我可以做得很好,但是由于JAXElement<SimItemType>
和JAXElement<Object>
之间没有转换,所以我不能将其添加到SimViewType中。 SimViews实际上不保持对SimItems的控制的想法在我的设计中至关重要,因此仅删除引用并不是一个好主意,因为它可能会在运行时造成危险的差异。如何创建SimItemType或JAXBElement以便可以将其与SimViewType一起使用?
最佳答案
XJC使用createSimViewTypeITEM方法生成ObjectFactory来创建ITEM元素。
/**
* Create an instance of {@link JAXBElement }{@code <}{@link Object }{@code >}}
*
*/
@XmlElementDecl(namespace = "", name = "ITEM", scope = SimViewType.class)
@XmlIDREF
public JAXBElement<Object> createSimViewTypeITEM(Object value) {
return new JAXBElement<Object>(_SimViewTypeITEM_QNAME, Object.class, SimViewType.class, value);
}
有帮助吗?