JAXB наследование с использованием substitutionGroup не работает при демаршаллинге - PullRequest
2 голосов
/ 29 июля 2011

У меня есть 10 схем в разных пространствах имен, каждая из которых имеет complexType и связанный элемент, который заменяет элемент с именем «Отчет», например:

<xsd:element name="MyReport" type="foo:MyReportType" substitutionGroup="bar:Report"/>

<xsd:element name="Report" abstract="true"/>

Когда я отменяю маршализацию документа XML, содержащего все 10 отчетов, при выполнении следующих действий обнаруживаются только 5:

JAXBContext context = JAXBContext.newInstance("com.foo.bar");
Unmarshaller unmarshaller = context.createUnmarshaller();
//get root node of xml
JAXBElement<ReportPackage> package = unmarshaller.unmarshal(new StreamSource(new File("example.xml")));
ReportPackage rp = package.getValue();
ReportSection reports = rp.getReports();
List<JAXBElement<?>> reportList = reports.getReport();
//iterate through the 10 reports
for (int i = 0; i < reportList.size(); i++) {
    JAXBElement rep = reportList.get(i);
    ...
}

Не имеет значения порядок отчетов иликоличество отчетов в XML.Те же 5 из 10 типов отчетов постоянно встречаются.Я использовал эталонную реализацию 2.24u1 и 2.1.10 (версия JDK 6) JAXB, оба безрезультатно.Похоже, что substitutionGroup игнорируется.Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 01 августа 2011

Попробуйте создать контекст JAXB следующим образом: JAXBContext.newInstance("package1:package2:package3:..."), где packageX s - это пакеты, в которых находятся ваши ObjectFactories.

...