置換グループから生成された抽象スーパークラスに関して、すべての JAXB マジックを正しく理解できないようです。JAXB の参照実装を使用しています。
クラス階層は次のとおりです。
+ DatasourceAbstract
+----- DatasourceQuery
+------DatasourceStatic
(以下に文書化されているように) クラスとそのすべてのサブクラスを明示的に JAXBContext に提供したことを考えると、なぜそれらが「知られていない」のかは謎です。
さらに情報が必要な場合は、お知らせください。関連すると思われるものはすべて提供しましたが、投稿を過負荷にしたくありませんでした.
エラー (わかりやすくするために多少編集されています):
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Invalid @XmlElementRef : Type "class com.escholar.reports.reportXML.DatasourceAbstract" or any of its subclasses are not known to this context.
this problem is related to the following location:
at protected java.util.LinkedList com.escholar.reports.reportXML.Data.dataSourceSubstitutionGroupHead
at com.escholar.reports.reportXML.Data
at protected com.escholar.reports.reportXML.Data com.escholar.reports.reportXML.ReportJAXB.data
at com.escholar.reports.reportXML.ReportJAXB
at public com.escholar.reports.reportXML.ReportJAXB com.escholar.reports.reportXML.ObjectFactory.createReportResourceJAXB()
at com.escholar.reports.reportXML.ObjectFactory
at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source)
..... Partially ellided stacktrace ............
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at com.escholar.reports.utilities.reportsamples.ReportXMLGenerator.main(ReportXMLGenerator.java:69)
JAXBContext の作成
JAXB コンテキスト (上記の例外をトリガーする行) を作成する場所は次のとおりです。
JAXBContext jc =
JAXBContext.newInstance(
com.escholar.reports.reportXML.ObjectFactory.class,
com.escholar.reports.reportXML.DatasourceAbstract.class,
com.escholar.reports.reportXML.DatasourceStatic.class,
com.escholar.reports.reportXML.DatasourceQuery.class);
DatasourceAbstract クラス
そして、これが不平を言っているクラスです。サブクラスを識別するために @XmlSeeAlso も使用したことに注意してください。
package com.escholar.reports.jaxb;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DatasourceAbstract")
@XmlSeeAlso({
DatasourceStatic.class,
DatasourceQuery.class
})
public abstract class DatasourceAbstract {
@XmlAttribute(name = "Name")
@XmlSchemaType(name = "anySimpleType")
protected String name;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
}
DatasourceAbstract への参照
DatasourceAbstract が参照される場所は次のとおりです。
package com.escholar.reports.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"dataSourceSubstitutionGroupHead"
})
@XmlRootElement(name = "Data")
public class Data {
@XmlElementRef(name = "DataSourceSubstitutionGroupHead", type = JAXBElement.class)
protected List<JAXBElement<?>> dataSourceSubstitutionGroupHead;
public List<JAXBElement<?>> getDataSourceSubstitutionGroupHead() {
if (dataSourceSubstitutionGroupHead == null) {
dataSourceSubstitutionGroupHead = new ArrayList<JAXBElement<?>>();
}
return this.dataSourceSubstitutionGroupHead;
}
}