JAXB-RI从XmlElementRefs带注释的成员生成意外的客户端代码

时间:2013-06-04 17:12:54

标签: jaxb

这是与相关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包含&lt; choice&gt;而不是&lt; choice maxOccurs =“unbounded”minOccurs =“0”&gt;

然后在客户端,我为每个可能的选择选项获得一个变量

@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&amp; JAX-WS并没有任何区别。

我是愚蠢还是这是一个JAXB-RI错误?

非常感谢提前。 欧文

1 个答案:

答案 0 :(得分:0)

啊,如果你对谷歌猛烈抨击你已经找到了答案......

http://blog.bdoughan.com/2011/04/xml-schema-to-java-xsd-choice.html