2013-02-27 76 views
1

我想訪問一個JAX-RS服務(球衣實現),它返回一個XML格式的僱員java.util.list。Jersey JAX-RS客戶端XML到java.util.List反序列化

的服務方法的簽名是這樣的:

@GET 
@Path("/getEmployeeListXML") 
@Consumes(MediaType.TEXT_PLAIN) 
@Produces(MediaType.APPLICATION_XML) 
public List<EmployeeXML> getEmployeeListXML(@QueryParam("id") String id){ 
    //Some code which returns a List<EmployeeXML> 
} 

返回的XML的格式是這樣的:

<employeeXMLs> 
    <employeeXML> 
      <empId>1</empId> 
      <empName>John</empName> 
      <empAge>35</empAge> 
      <empSex>Male</empSex> 
    </employeeXML> 
    <employeeXML> 
      <empId>2</empId> 
      <empName>Lisa</empName> 
      <empAge>23</empAge> 
      <empSex>Female</empSex> 
    </employeeXML> 
</employeeXMLs> 

對於從我的球衣客戶端訪問這個,我使用這個代碼:

List<EmployeeXML> empListXML = (List<EmployeeXML>)service.path("rest").path("GetService").path("getEmployeeListXML").accept(MediaType.APPLICATION_XML).get(EmployeeXML.class); 

這是不正確的,因爲返回類型應該是一個清單,但在get方法,對很抱歉,我正在嘗試檢索單個對象。我不知道如何從這裏的客戶端:(

我得到這個例外列表:

unexpected element (uri:"", local:"employeeXMLs"). Expected elements are <{}employeeListXML>,<{}employeeXML> 

請幫助我,使這項工作

感謝,

回答

3

你需要使用「超標記」在您的客戶端類中定義的返回類型:

List<EmployeeXML> empListXML = service 
    .path("rest") 
    .path("GetService") 
    .path("getEmployeeListXML") 
    .accept(MediaType.APPLICATION_XML) 
    .get(new GenericType<List<EmployeeXML>>() {}); 

爲了'保留'Jersey反序列化服務器響應時將使用的通用參數信息,超類別標記是必需的。

+0

感謝,否則我得到一個編譯錯誤'類型WebResource.Builder中的方法get(類)不適用於參數(Type)'。 – WhoAmI 2013-02-27 14:15:47

+0

@WhoAmI - 是的,'getType()'不需要,我更新了我的答案。 – Perception 2013-02-27 14:36:24

4

可以使用GenericType類獲取對象的列表:爲immidiate答覆:)我不得不從最後刪除.getType()

List<EmployeeXML> empListXML = (List<EmployeeXML>)service.path("rest").path("GetService").path("getEmployeeListXML").accept(MediaType.APPLICATION_XML).get(new GenericType<List<EmployeeXML>>(){}); 
+0

感謝您的回覆...它工作正常:) – WhoAmI 2013-02-27 14:16:18

+0

我無法想象您發佈此時沒有看到我的答案。哇。 – Perception 2013-02-27 14:37:13

+1

@Perception相信與否,但我擁有自己的大腦。我不需要複製某人。 – flash 2013-02-28 06:28:41