【问题标题】:Type of substitution group or any of its subclasses are not known to this context在此上下文中不知道替代组的类型或其任何子类
【发布时间】:2013-02-01 17:03:32
【问题描述】:

对于从替代组生成的抽象超类,我似乎无法正确理解所有 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);

数据源抽象类

这是它抱怨的班级。请注意,我还使用了@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;
    }
}

【问题讨论】:

    标签: xml jaxb xml-serialization jaxb2


    【解决方案1】:

    在从 XML 模式生成的模型上创建 JAXBContext 时,您应该在生成的模型的包名称上而不是单个类上执行此操作。这将有助于确保 JAXBContext 引入所有必要的类。

    JAXBContext jc = JAXBContext.newInstance("com.escholar.reports.reportXML");
    

    【讨论】:

    • 首先,感谢 Blaise 的快速响应。您是明确的“JAXB 新手 [甚至是专业人士] 的守护神”。我做了那个改变,但我仍然遇到同样的问题。如果您有任何进一步的建议(或需要更多信息 - 我肯定没有提供太多),我会全神贯注。我知道有一些包级别的注释。 XJC似乎没有生成任何东西,所以我的没有。
    • @DaBlick - 您的堆栈跟踪包含包com.escholar.reports.reportXML,但您的问题包含包com.escholar.reports.jaxb。这里有两个模型在玩吗?
    • 嗯...我不这么认为。我认为我的stackoverflow帖子中存在错误,而不是代码中。基本上,我使用 xjc 来生成 java 类,而这些类都以 reports.jaxb 结尾。我不小心在我的帖子中包含了原始类,但在实际项目中没有对 com.escholar.reports.jaxb 的任何引用(也没有定义)。我已经通过 Eclipse 文本搜索字符串“reports.jaxb”确认了这一点。我可以确认项目中有 com.escholar.reports.reportXML 类的定义。
    • 我还可以确认com.escholar.reports.jaxb 不在类路径中,也不在构建路径中。
    • 事实证明,将@XmlRootElement 添加到DatasourceAbstract(及其子类)会使事情正常工作。现在这不是一个理想的解决方案,因为DatasourceAbstract 是抽象的,因此我们永远不会看到&lt;DatasourceAbstract&gt; 标记。我很乐意将其中的包裹压缩/通过电子邮件发送给您,因为我想了解它。但既然我回来了,这并不紧急。不要滥用您非常亲切的帮助意愿。
    【解决方案2】:

    我遇到了同样的问题,所以我分享我的解决方案:

    @XmlSeeAlso()
    

    由于子类的延迟加载,JAXB 几乎不可能在正确的时间使用子类。

    我的基础抽象类是 FieldMapping,继承的是 FileFieldMapping 和 DatabaseFieldMapping(为了简洁,这里省略了实现)。

    @XmlRootElement(name = "fieldMapping")
    @XmlSeeAlso({DatabaseFieldMapping.class, 
    FileFieldMapping.class})
    public abstract class FieldMapping {
    
    }
    
    @XmlRootElement(name = "fileFieldMapping")
    public class FileFieldMapping extends FieldMapping {
    }
    
    @XmlRootElement(name = "databaseFieldMapping")
    public class DatabaseFieldMapping extends 
    FieldMapping 
    {
    }
    

    你可以找到更多herehere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2011-06-25
      • 2012-03-01
      • 2014-07-03
      相关资源
      最近更新 更多