Коллекция XML Client Джерси Unmarshalling

Я пишу клиент для отдыха, используя jersey-client v2.3.1, и мне нужно разобрать ответ xml с корнем узел, содержащий набор узлов виджетов. Что-то похожее на следующее...

<widgets>
    <widget />
    ...
    <widget />
</widgets>

В настоящее время у меня есть модель Widget ...

public class Widget {
    ...
}

Однако у меня нет оболочки для этой модели (по крайней мере, пока), но я полагаю, что мог бы создать ее, которая позволила бы неупорядочивать ответ. Наверное, это выглядело бы примерно так...

@XmlRootElement(name="widgets")
public class WidgetResponse {
    @XmlElement(name="widget")
    public Widget[] widgets;
}

В этом случае мой вызов на отдых, вероятно, будет ...

ClientBuilder.newClient()
    .target("http://host/api")
    .path("resource")
    .request(MediaType.APPLICATION_XML)
    .get(WidgetsResponse.class)

Мой вопрос: можно ли красиво рассортировать запрос без необходимости создавать класс-оболочку с помощью jersey-client/jaxb?


person LeastOne    schedule 06.11.2013    source источник
comment
Вы пробовали это? Каков был результат?   -  person    schedule 06.11.2013
comment
Да, создание WidgetResponse работает. Я обновил вопрос, включив в него аннотации jaxb, которые используются для его работы. Однако мне нужно решение, которое не требует создания контейнера для хранения результатов.   -  person LeastOne    schedule 07.11.2013


Ответы (2)


Следующие две ссылки привели меня к решению...

Без класса-оболочки коллекцию можно получить с помощью аннотации @XmlRootElement jaxb, примененной к модели...

@XmlRootElement
public class Widget {
    ...
}

А затем изменить вызов клиента для использования класса GenericType. Чтобы получить массив, вы можете вызвать...

Widget[] widgets = ClientBuilder.newClient()
    .target("http://host/api")
    .path("resource")
    .request(MediaType.APPLICATION_XML)
    .get(new GenericType<Widget[]>(){});

Или аналогично, чтобы получить список, который вы можете вызвать...

List<Widget> widgets = ClientBuilder.newClient()
    .target("http://host/api")
    .path("resource")
    .request(MediaType.APPLICATION_XML)
    .get(new GenericType<List<Widget>>(){});
person LeastOne    schedule 06.11.2013

С точки зрения JAXB:

Вы можете создать XMLStreamReader и просто пропустить первый тег при разупорядочении.

 XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
 XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream("widgets.xml"));
 xmlStreamReader.nextTag(); // <widgets>
 xmlStreamReader.nextTag(); // first <widget>
person Iaroslav Savytskyi    schedule 07.11.2013