1

我正在使用jersey-client v2.3.1编写一个休息客户端,并且需要使用包含一组小部件节点的根节点来解组 xml 响应。像下面这样的东西......

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

目前我有一个小部件模型......

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 创建包装类吗?

4

2 回答 2

3

以下两个参考资料使我找到了解决方案...

如果没有包装类,可以使用@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>>(){});
于 2013-11-06T21:46:38.540 回答
0

从 JAXB 角度来看:

您可以创建 XMLStreamReader 并在解组时跳过第一个标签。

 XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
 XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream("widgets.xml"));
 xmlStreamReader.nextTag(); // <widgets>
 xmlStreamReader.nextTag(); // first <widget>
于 2013-11-07T15:15:31.307 回答