gpt4 book ai didi

java - 1 个 IDREF 与 1 个以上的 JAXB 不一致

转载 作者:行者123 更新时间:2023-11-29 09:25:01 26 4
gpt4 key购买 nike

所以我一直在阅读有关在 JAXB 中使用 ID 和 IDREF 的信息 here ,并且在给出的示例中,他们使用了 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,我可以做得很好,但是我不能将它添加到我的 SimViewType 中,因为 JAXElement<SimItemType> 之间没有转换。和 JAXElement<Object> . 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);
}

有帮助吗?

关于java - 1 个 IDREF 与 1 个以上的 JAXB 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com