JAXB:unmarshal时未定义的id“”

时间:2017-01-18 09:57:06

标签: java xml jaxb unmarshalling

说我的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"/>有错误:

  

未定义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 blogthis blogquestion,但未发现此错误的任何线索。

1 个答案:

答案 0 :(得分:0)

通过一整天的搜索和试验,我终于找到了错误并解决了它:

C实际上有哪个类不是直接A的引用,而是B只有一个引用的类<xs:complexType name="C"> <xs:choice> <xs:element name="B" type="xs:IDREF"/> </xs:choice> </xs:complexType> 。所以解决方案现在很清楚:

要么将xsd更改为:

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;
  }
}

或者更改java代码:

BEGIN;

  INSERT INTO scholarshipDetail(schid,schName,year)  VALUES(3,'sun',2017);

  INSERT INTO scholarshipCourse(schID,course) VALUES(LAST_INSERT_ID(),'science');

COMMIT;

如果您对我如何解决此问题感兴趣,可以参考my blog