如何在每个方法的基础上限制JAX-RS中的对象图?

时间:2014-03-07 17:46:46

标签: java jax-rs

我有一个包含用户名和电子邮件地址的实体类。对于我的应用程序的某些部分,我需要一个具有id,用户名和电子邮件地址的用户列表。对于其他部分,我需要一个列表,没有通过网络发送的特定字段(在这种情况下是电子邮件地址)。是否有一个注释可以放在一个方法上,该方法限制了我可以放在getListWithoutEmails方法上创建的对象图?

即。 @LimitTo(value = {“id”,“username”})或@Ignore(value = {“emailAddress”})

环境是Wildfly及其预先捆绑的JAX-RS。

这是实体类

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class User {
  @XmlElement
  private Long id;
  @XmlElement
  private String username;
  @XmlElement
  private String emailAddress;
}

这是JAX-RS类

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("userList")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class UserList {
  @GET
  @Path("/getListWithEmails/{start:\\d+}/{limit:\\d+}/{sortColumn}/{sortDirection}")
  @HasRoleEmailReader
  public List<User> getListWithEmails(@PathParam("start")
  final int start, @PathParam("limit")
  final int limit, @PathParam("sortColumn")
  final String sortColumn, @PathParam("sortDirection")
  final String sortDirection) {
    getUsers(...);
  }

  @GET
  @Path("/getListWithoutEmails/{start:\\d+}/{limit:\\d+}/{sortColumn}/{sortDirection}")
  public List<User> getListWithoutEmails(@PathParam("start")
  final int start, @PathParam("limit")
  final int limit, @PathParam("sortColumn")
  final String sortColumn, @PathParam("sortDirection")
  final String sortDirection) {
    getUsers(...);
  }

  ...
}

1 个答案:

答案 0 :(得分:0)

JAX-RS不负责序列化自定义返回类型,因此您还应该查看用于实际序列化过程的任何框架。由于我不知道使用了什么库,因此我给出了一些应该达到您想要实现的目标的一般步骤:

  1. 为您创建自定义注释方法。
  2. 创建MessageBodyWriter - 您可以添加@Produce以将其限制为JSON返回类型。
  3. 实施isWritable,在此处查看注释的annotations参数。
  4. 实施writeTo。如果存在注释,则自定义序列化过程。如何执行此操作取决于您使用的序列化库。也许它有一个忽略属性的功能,也许你需要手工完成。
  5. @Provider添加到资源类以使用编写器。