簡體   English   中英

Jersey Client Xml Collection Unmarshalling

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM