JAX RS自动Marshal / Unmarshal在根对象中列出对象

时间:2015-08-12 12:29:39

标签: java java-ee jax-rs

我在服务类

中有类似跟随的方法
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response listUsers( 
        @QueryParam("page") @DefaultValue("1") Integer page,
        @QueryParam("sortFields") @DefaultValue("id") String sortFields,
        @QueryParam("sortDirections") @DefaultValue("asc") String sortDirections) {

    PaginatedListWrapper listWrapper = new PaginatedListWrapper<>();
    listWrapper.setCurrentPage(page);
    listWrapper.setSortFields(sortFields);
    listWrapper.setSortDirections(sortDirections);
    listWrapper.setTotalResults(this.countAll());

    int start = (listWrapper.getCurrentPage() - 1) * listWrapper.getPageSize();
    listWrapper.setList(userFacade.findRange(new int[]{start, listWrapper.getPageSize()}));

    return Response.status(Response.Status.OK).entity(listWrapper).build();
}

我的PaginatedListWrapper类如下

public class PaginatedListWrapper {
private Integer currentPage;
private Integer pageSize;
private Integer totalResults;

private String sortFields;
private String sortDirections;
private List list;

...

我正在获得如下的输出

Object{ currentPage: 1,  list: Array[2], 0: "net.brac.ict.mis.tup.uplift.business.entities.User[ id=1 ]" 1: "net.brac.ict.mis.tup.uplift.business.entities.User[ id=2 ]" , pageSize: 10,  sortDirections: "asc", sortFields: "id"…}

为什么我没有将用户列表作为json对象?像对象数组[{},{},{} ...] 我在这里失踪了什么? 除了使用泽西或杰克逊之外,我想学习这样做的核心内容。 在我的maven中它只是javaee-web-api和eclipselink

1 个答案:

答案 0 :(得分:0)

如果您的User实体使用JAXB注释进行注释,那么基本上可以做得更简单:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Collection<User> listUsers( 
        @QueryParam("page") @DefaultValue("1") Integer page,
        @QueryParam("sortFields") @DefaultValue("id") String sortFields,
        @QueryParam("sortDirections") @DefaultValue("asc") String sortDirections) {

    PaginatedListWrapper listWrapper = new PaginatedListWrapper<>();
    listWrapper.setCurrentPage(page);
    listWrapper.setSortFields(sortFields);
    listWrapper.setSortDirections(sortDirections);
    listWrapper.setTotalResults(this.countAll());

    int start = (listWrapper.getCurrentPage() - 1) * listWrapper.getPageSize();
    return userFacade.findRange(new int[]{start, listWrapper.getPageSize()});
}

JAX-RS有一个内置的Collection MessageBodyWriter提供程序,并会相应地使用JAXB映射您的实体。这就是我在JAX-RS服务中返回所有实体的方式。