Тип группы замещения или любого из ее подклассов неизвестен в этом контексте.

Кажется, я не могу правильно понять всю магию 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)

JAXBСоздание контекста

Здесь я создаю контекст 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;
    }
}

person DaBlick    schedule 01.02.2013    source источник


Ответы (2)


При создании JAXBContext для модели, сгенерированной из схемы XML, вы должны делать это с именем пакета сгенерированной модели, а не с отдельными классами. Это поможет убедиться, что JAXBContext использует все необходимые классы.

JAXBContext jc = JAXBContext.newInstance("com.escholar.reports.reportXML");
person bdoughan    schedule 01.02.2013
comment
Во-первых, спасибо за быстрый ответ, Блейз. Вы явный покровитель новичков JAXB [и даже профессионалов]. Я сделал это изменение, но у меня все еще есть та же проблема. Если у вас есть какие-либо дополнительные предложения (или вам нужна дополнительная информация - я, конечно, не предоставил много), я был бы внимателен. Я знаю, что есть некоторые аннотации на уровне пакетов. XJC, похоже, ничего не сгенерировал, поэтому в моем их нет. - person DaBlick; 02.02.2013
comment
@DaBlick - в вашей трассировке стека есть пакет com.escholar.reports.reportXML, но в вашем вопросе есть пакет com.escholar.reports.jaxb. Здесь две модели? - person bdoughan; 02.02.2013
comment
Хм... не думаю. Я думаю, что ошибка в моем сообщении stackoverflow, а не в коде. В основном я использовал xjc для создания классов Java, и все они оказались в файле report.jaxb. Я случайно включил исходные классы в свой пост, но в реальном проекте нет ни ссылок (ни определений) ни на что из com.escholar.reports.jaxb. Я подтвердил это с помощью текстового поиска в Eclipse строки report.jaxb. Я могу подтвердить, что в проекте есть определение класса com.escholar.reports.reportXML. - person DaBlick; 04.02.2013
comment
Я также могу подтвердить, что com.escholar.reports.jaxb не находится ни в пути к классам, ни в пути сборки. - person DaBlick; 04.02.2013
comment
@DaBlick - Можно ли обновить ваш вопрос, указав достаточно информации, чтобы я мог попытаться воссоздать вашу ошибку? - person bdoughan; 04.02.2013
comment
оказывается, что добавление @XmlRootElement к DatasourceAbstract (и его подклассам) заставляет все работать. Это не идеальное решение, потому что DatasourceAbstract является абстрактным, и поэтому мы никогда не должны видеть тег <DatasourceAbstract>. Я был бы рад заархивировать / отправить вам по электронной почте пакет, в котором это находится, потому что я хотел бы понять это. Но так как я снова в деле, это не срочно. Не хочу злоупотреблять вашей очень любезной готовностью помочь. - person DaBlick; 05.02.2013
comment
@DaBlick. Вы можете отправить мне электронное письмо по адресу: blaise.doughan AT gmail DOT com. - person bdoughan; 05.02.2013
comment
Спасибо как всегда. На самом деле мне не очень легко извлечь компилируемый/исполняемый пример. Причина в том, что модели JAXB расширяют суперклассы и реализуют интерфейсы, которых нет в модели JAXB. В то время как классы JAXB автономны, их суперклассы/интерфейсы не являются таковыми, и я думаю, что они в конечном итоге привносят почти все остальное в проект через граф зависимостей (импорт). Тем не менее, я заархивирую столько, сколько смогу, и отправлю вам по электронной почте. - person DaBlick; 06.02.2013
comment
Пожалуйста, знайте, что я признаю, что это неподходящий способ документирования ошибки. Но, пожалуйста, помните, что на данный момент решение этого не является критическим/необходимым. Если вы чувствуете, что попытка определить проблему по неисполняемому примеру — не лучший способ потратить время, это нормально. Я больше не застрял и ценю вашу любезную помощь. - person DaBlick; 06.02.2013

Я столкнулся с той же проблемой, и поэтому я делюсь своим решением:

@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 
{
}

Вы можете найти больше здесь и здесь

person Massimo    schedule 07.09.2018