这是来自与所讨论的 WSDL 相关联的 XSD 的片段。
<complexType name="ValueMapEntry">
<complexContent>
<restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
<sequence>
<choice maxOccurs="unbounded" minOccurs="0">
<element ref="{namespace...}bi"/>
<element ref="{namespace...}a"/>
<element ref="{namespace...}s"/>
<element ref="{namespace...}b"/>
<element ref="{namespace...}t"/>
<element ref="{namespace...}d"/>
<element ref="{namespace...}dt"/>
<element ref="{namespace...}dur"/>
<element ref="{namespace...}de"/>
<element ref="{namespace...}l"/>
<element ref="{namespace...}f"/>
</choice>
</sequence>
<attribute name="k" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
</restriction>
</complexContent>
</complexType>
所以我们有一个复杂类型,它包含一些其他复杂类型的列表,所有这些类型都扩展了同一个基类(称为 Value)
这一切都很好,并在客户端 java 代码中生成......
@XmlElements({
@XmlElement(name = "de", namespace = "namespace...", type = ValueDecimal.class),
@XmlElement(name = "l", namespace = "namespace...", type = ValueLong.class),
@XmlElement(name = "d", namespace = "namespace...", type = ValueDate.class),
@XmlElement(name = "dt", namespace = "namespace...", type = ValueDateTime.class),
@XmlElement(name = "dur", namespace = "namespace...", type = ValueDuration.class),
@XmlElement(name = "a", namespace = "namespace...", type = ValueAnySimpleType.class),
@XmlElement(name = "f", namespace = "namespace...", type = ValueDouble.class),
@XmlElement(name = "t", namespace = "namespace...", type = ValueTime.class),
@XmlElement(name = "s", namespace = "namespace...", type = ValueString.class),
@XmlElement(name = "b", namespace = "namespace...", type = ValueBoolean.class),
@XmlElement(name = "bi", namespace = "namespace...", type = ValueBinary.class)
})
protected List<Value> biOrAOrSOrB.....;
但是,如果我将服务器端类更改为单个项目而不是列表,即 WSDL 包含 <choice> 而不是 <choice maxOccurs="unbounded" minOccurs="0">
然后在客户端我为每个可能的选择选项得到一个变量
@XmlElement(namespace = "namespace...")
protected ValueBinary bi;
@XmlElement(namespace = "namespace...")
protected ValueAnySimpleType a;
@XmlElement(namespace = "namespace...")
protected ValueString s;
@XmlElement(namespace = "namespace...")
protected ValueBoolean b;
等等,你会得到一般的图片。现在既然 xs:choice 只允许选择列表中的一项,那么生成的第二批代码肯定是不正确的,因为我仍然应该只得到一个变量?
我尝试更新到最新的 JAXB-RI 和 JAX-WS,但没有任何区别。
我是愚蠢还是这是一个 JAXB-RI 错误?
提前谢谢了。欧文