JAX RS auto Marshal/Unmarshal 列出根对象中的对象

JAX RS auto Marshal/Unmarshal List objects inside root objects

我在服务中有一个类似以下的方法class

@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 class 如下所示

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 对象?像对象数组 [{}, {}, {} ...] 我在这里缺少什么? 除了使用 jersey 或 jackson 之外,我还想学习这样做的底层核心内容。 在我的 Maven 中它只是 javaee-web-api 和 eclipselink

如果您的 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 为您映射您的实体。这就是我 return 我的 JAX-RS 服务中所有实体的方式。