Jersey JAX-RS Client XML到java.util.List反序列化

时间:2013-02-27 13:58:22

标签: java web-services rest jersey jax-rs

我正在尝试访问一个JAX-RS服务(jersey实现),它返回一个XML格式的Employees 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方法中,目前我正在尝试检索单个对象。我不知道如何从客户端检索List:(

我得到了这个例外:

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

请帮我完成这项工作。

谢谢,

2 个答案:

答案 0 :(得分:4)

您可以使用GenericType类来获取对象列表:

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

答案 1 :(得分:3)

您需要使用“超类型令牌”来定义客户端类中的返回类型:

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

为了“保留”Jersey在反序列化服务器响应时将使用的通用参数信息,需要超类型令牌。