1

置換グループから生成された抽象スーパークラスに関して、すべての 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;
    }
}
4

2 に答える 2

0

XML スキーマから生成されたモデルでを作成する場合JAXBContextは、個々のクラスではなく、生成されたモデルのパッケージ名で行う必要があります。JAXBContextこれにより、 が必要なすべてのクラスを確実に取り込むことができます。

JAXBContext jc = JAXBContext.newInstance("com.escholar.reports.reportXML");
于 2013-02-01T17:05:44.257 に答える