[英]Jersey Client Xml Collection Unmarshalling
我正在使用jersey-client v2.3.1編寫一個rest客戶端 ,需要使用包含一組 widget節點的根節點來解組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創建包裝類?
以下兩個參考文獻引導我找到解決方案......
如果沒有包裝類,可以使用應用於模型的@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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.