Jersey客户端XML集合解组(Jersey Client Xml Collection Unma

2019-10-18 22:03发布

我使用的是写一个REST客户端球衣的客户端V2.3.1 ,需要解组含有小部件节点的集合根节点的XML响应。 像类似下面的...

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

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

public class Widget {
    ...
}

但是我没有这种模式(至少目前还没有)的包装,但我相信我可以创建一个将允许响应解组。 它可能会是这个样子?

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

在这种情况下,我的REST调用可能会是...

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

我的问题是,可以将请求而不必使用球衣的客户端/ JAXB来创建一个包装类很好解组?

Answer 1:

下面的两个引用导致我的解决方案...

  • getEntity与GenericType
  • 新泽西州的REST客户端

如果没有包装类集合可以与检索@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>>(){});


Answer 2:

从JAXB点:

您可以创建的XMLStreamReader,只是跳过第一个标签进行解。

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


文章来源: Jersey Client Xml Collection Unmarshalling