我使用的是写一个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来创建一个包装类很好解组?
下面的两个引用导致我的解决方案...
- 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>>(){});
从JAXB点:
您可以创建的XMLStreamReader,只是跳过第一个标签进行解。
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream("widgets.xml"));
xmlStreamReader.nextTag(); // <widgets>
xmlStreamReader.nextTag(); // first <widget>