Java - JAXB заставляет XML-узел к типу данных ElementNSImpl - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий объектный класс QueryResult:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="QueryResult", namespace = "")
public class QueryResult {

    public QueryResult()
    {
        this.attachments = new ArrayList<QueryAttachment>();
    }

    @XmlElement(name = "Error")
    protected QueryError error;

    @XmlAnyElement(lax=true)
    protected Element content;
}

И я хочу отменить сортировку следующей переменной queryResultXml, которая является jdom.Document:

<?xml version="1.0" encoding="UTF-8"?>
<QueryResult xmlns:func="urn:oio:ebst:diadem:functions" xmlns:meta="urn:oio:ebst:diadem:metadata:1" xmlns:er="urn:oio:ebst:diadem:Byggeskadefondendokument:1">
    <er:Byggeskadefondendokumenter meta:key="MetadatKey">
        <er:EftersynsrapportIndikator meta:key="MetadatKey/1">false</er:EftersynsrapportIndikator>
        <er:ByggeskadefondendokumentSamling meta:key="MetadatKey/2" />
    </er:Byggeskadefondendokumenter>
</QueryResult>

Я использую следующий код в порядкеunmarshall:

QueryResult result = XmlHelper.parseGenericObjectFromXmlString(new XMLOutputter().outputString(queryResultXml), QueryResult.class)

Метод parseGenericObjectFromXmlString:

static <T> T parseGenericObjectFromXmlString(String xml, Class<T> genericType) {
        JAXBContext jc = JAXBContext.newInstance(genericType)
        Unmarshaller unmarshaller = jc.createUnmarshaller()

        def obj = (T) unmarshaller.unmarshal(new StringReader(xml))
        return obj
    }

JAXB затем генерирует следующее исключение:

java.lang.ClassCastException: org.apache.xerces.dom.ElementNSImpl cannot be cast to org.jdom.Element

at diadem.dirigent.plugin.integration.QueryResult$JaxbAccessorF_content.set(FieldAccessor_Ref.java:45)
at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.receive(Accessor.java:151)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:597)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:165)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214)
at diadem.base.plugin.helpers.XmlHelper.parseGenericObjectFromXmlString(XmlHelper.groovy:22)
at diadem.dirigent.plugin.IntegrationService.getResult(IntegrationService.groovy:95)
at diadem.dirigent.plugin.IntegrationService.callSourceSystem(IntegrationService.groovy:65)
at diadem.dirigent.plugin.IntegrationService.processQueryInput(IntegrationService.groovy:36)
at diadem.dirigent.plugin.IntegrationService.processQueryInput(IntegrationService.groovy:24)
at diadem.dirigent.plugin.IntegrationServiceSpec.test Integration processQuery with Byggeskadefond query definition(IntegrationServiceSpec.groovy:105)

JAXB автоматически вызывает свойство QueryResult.Content для ElementNSImpl, но почему вместо этого он не отображает неупорядоченный контент в тип данных Element?JAXB делает это для всех свойств с аннотацией @XmlAnyElement?

1 Ответ

0 голосов
/ 29 сентября 2018

Исключение

java.lang.ClassCastException: org.apache.xerces.dom.ElementNSImpl cannot be cast to org.jdom.Element

говорит о том, что вы использовали неправильный Element класс в

@XmlAnyElement(lax=true)
protected Element content;

Очевидно, вы использовали org.jdom.Element.Но вместо этого вам нужно использовать org.w3c.dom.Element.

. Это описано в примерах Usages в Javadoc из @XmlAnyElement.Обратите особое внимание на ссылки Element, указанные там и на которые они указывают.

Использование:

@ XmlAnyElement
public Element [] другие;

// Коллекция Element или элементов JAXB.
@XmlAnyElement (lax = "true")
public Object [] others;

@ XmlAnyElement
приватный список <<a href="https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Element.html" rel="nofollow noreferrer"> Element > узлов;

@ XmlAnyElement
private Элемент узел;

JAXB использует класс ElementNSImpl, который является реализацией интерфейса org.w3c.dom.Element.

...