Как правильно распаковать результат запроса на основе схемы (например, xwiki)?

1

Я использовал определение схемы XWiki для создания с помощью Eclipse XJC Binding Compiler модели класса объектов. В package-info.java создается следующее пространство имен

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.xwiki.org", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.xwiki.rest.model.jaxb;

Когда я прочитал пример из HttpResponse

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<page xmlns="http://www.xwiki.org">
   <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main" />
   ...
</page>

с JAXB

try {
   JAXBContext context = JAXBContext.newInstance(org.xwiki.rest.model.jaxb.Page.class);
   Unmarshaller unmarshaller = context.createUnmarshaller();
   InputStream is = new FileInputStream(new File("request_result.xml"));
   Page page = (Page) unmarshaller.unmarshal(is);
} catch (JAXBException e) {
   e.printStackTrace();
} catch (FileNotFoundException e) {
   e.printStackTrace();
}

исключение

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.xwiki.org", local:"page"). Expected elements are <{http://www.xwiki.org}attachments>,<{http://www.xwiki.org}classes>,<{http://www.xwiki.org}comments>,<{http://www.xwiki.org}history>,<{http://www.xwiki.org}objects>,<{http://www.xwiki.org}pages>,<{http://www.xwiki.org}properties>,<{http://www.xwiki.org}searchResults>,<{http://www.xwiki.org}spaces>,<{http://www.xwiki.org}tags>,<{http://www.xwiki.org}wikis>
   at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:648)
   at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236)
   ...

бросается.

Я не понимаю, что неправильно, потому что пространство имен кажется правильным. Что мне нужно изменить, чтобы получить рабочий API XWiki RESTful?

Теги:
rest
jaxb
xwiki

1 ответ

1
Лучший ответ

Отображение элемента page вероятно, @XmlElementDecl аннотацией @XmlElementDecl в сгенерированном классе ObjectFactory. Вы можете изменить свое создание JAXBContext следующим образом:

JAXBContext context = JAXBContext.newInstance(org.xwiki.rest.model.jaxb.ObjectFactory.class);

Или вы можете просто создать JAXBContext в имени пакета сгенерированной модели:

JAXBContext context = JAXBContext.newInstance("org.xwiki.rest.model.jaxb");

ОБНОВИТЬ

Спасибо, это немного помогло. Теперь я получаю исключение в потоке "main" java.lang.ClassCastException: javax.xml.bind.JAXBElement нельзя отнести к org.xwiki.rest.model.jaxb.Page.

Результат, который вы получаете, когда root аннотируется с помощью @XmlElementDecl вместо @XmlRootElement является экземпляром JAXBElement который содержит экземпляр класса домена.

Вы можете сделать следующее:

JAXBElement<Page> jaxbElement = (JAXBElement<Page>) unmarshaller.unmarshal(is);
Page page = jaxbElement.getValue();

Или:

Page page = (Page) JAXBIntrospector.getValue(unmarshaller.unmarshal(is));

Чтобы получить больше информации

Я написал больше об этом конкретном случае использования в своем блоге:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню