JAX-RS:如何在返回Response对象时自动序列化集合?

Ray*_*oal 17 jax-rs jaxb jersey

我有一个带JAXB注释的员工类:

@XmlRootElement(name = "employee")
public class Employee {

    private Integer id;
    private String name;

    ...

    @XmlElement(name = "id")
    public int getId() {
        return this.id;
    }

    ... // setters and getters for name, equals, hashCode, toString
}
Run Code Online (Sandbox Code Playgroud)

还有一个JAX-RS资源对象(我使用的是Jersey 1.12)

@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public List<Employee> findEmployees(
    @QueryParam("name") String name, 
    @QueryParam("page") String pageNumber,
    @QueryParam("pageSize") String pageSize) {
    ...
    List<Employee> employees = employeeService.findEmployees(...);

    return employees;
}
Run Code Online (Sandbox Code Playgroud)

此端点工作正常.我明白了

<employees>
  <employee>
    <id>2</id>
    <name>Ana</name>
  </employee>
</employees>
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改方法以返回Response对象,并将员工列表放在响应正文中,如下所示:

@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public Response findEmployees(
    @QueryParam("name") String name, 
    @QueryParam("page") String pageNumber,
    @QueryParam("pageSize") String pageSize) {
    ...
    List<Employee> employees = employeeService.findEmployees(...);

    return Response.ok().entity(employees).build();
}
Run Code Online (Sandbox Code Playgroud)

由于以下异常,端点导致HTTP 500:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/xml was not found

在第一种情况下,JAX-RS显然安排了正确的消息编写器在返回集合时启动.当集合放置在实体主体中时,这似乎有些不一致.在返回响应时,我可以采用什么方法来实现列表的自动JAXB序列化?

我知道我可以

  • 只需从资源方法返回列表
  • 创建一个单独的EmployeeList

但是想知道是否有一种很好的方法来使用该Response对象并使列表序列化而不创建我自己的包装类.

bdo*_*han 26

您可以List<Employee>在实例中包装GenericEntity以保留类型信息: