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 服务中所有实体的方式。
我在服务中有一个类似以下的方法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 服务中所有实体的方式。