JAXB:解组时未定义的 id“”

JAXB: undefined id "" when unmarshal

说我的 xml 应该如下所示:

<!-- even I move <A id="2">...</A> here, still has this error-->
<A id="1">
    ...
       ... (many levels of nested element)
       <C>
           <B ref="2"/>
       </C> 
    ...
</A>
<A id="2">...</A>

所以我定义了以下xsd文件:

<xs:complexType name="A" abstract="true">
    <xs:attribute name="id" type="xs:ID" use="required"/>
    ...
</xs:complexType>
<xs:complexType name="B">
    <xs:attribute name="ref" type="xs:IDREF" use="required"/>
</xs:complexType>

但是当我想使用 JAXB 解析这个 xml 文件时,它总是抱怨 <B ref="2"/> 有一个错误:

Undefined ID "".

我的代码:

public class A {
  private String id;

  @XmlAttribute
  @XmlID
  public String getId() {
    return id;
  }

  ...
}

public class C {
  private A b;

  @XmlIDREF
  @XmlElement
  public A getB() {
    return b;
  }
}

那么问题是什么?

我已经阅读了this blog, this blog, question,没有找到任何关于这个错误的线索。

经过一整天的查找和试验,终于找到错误并解决了:

classC实际拥有的不是直接A的ref,而是classB只有一个ref。所以现在解决方案很清楚:

要么将 xsd 更改为:

<xs:complexType name="C">
    <xs:choice>
        <xs:element name="B" type="xs:IDREF"/>
    </xs:choice>
</xs:complexType>

或更改 java 代码:

public class C {
  private B b;
  ...
}
// addint a B class which contains the reference
public class B {
  private A b;
  @XmlIDREF
  @XmlElement
  public A getB() {
    return b;
  }
}

如果你对我如何解决这个问题感兴趣,你可以参考my blog