Jersey / JAXB:对HTTP POST和GET使用相同的POJO,但在JSON响应中仅返回GET的一部分属性。

时间:2012-06-19 19:20:35

标签: java json jaxb jersey jax-rs

这似乎是另一个相当简单的事情,但我再次在如何做到这一点上苦苦挣扎。

我有一个POJO,其中包含与之关联的HTTP POST和GET方法的Jersey / JAXB注释。在POJO上进行POST时,请求体将作为JSON发送,基本上是对POJO进行建模。在进行GET时,我想返回POJO,但只有POJO属性的子集。

我尝试在我不想要GET的属性上使用@XmlTransient,但是在HTTP POST期间我不能使用这些属性。

首先,这是我的POJO(User.java)

import javax.xml.bind.annotation.*
@XmlRootElement
public class User {
  private String userName;
  private String userEmail;
  private String userType;  // Do not return this property in GET
  private String userTmpPassword;  // Do not return this property in GET

  // User constructor
  public User(String userName,...) {
    this.userName = userName;
    //...etc...
  }

  // getters and setters with @XmlElement on each attribute 
  //...etc...
  @XmlElement(name="user_name")
  public String getUserName() {
    return userName;
  }
  public String setUserName() {
    return userName;
  }
  //...etc...
}

这是我的RESTful服务类:

public class userService{
  @POST
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getUser(User userInfoAsJSON) {
    User user = new User(userInfoAsJSON.getUserName(), ...);
    // pseudo-code for persisting User
    writeUserToDB(user);
    return Response.status(200);
  }

  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getUser(String Id) {
    // Pseudo-code for retrieving user
    User user = retrieveUserFromDB(user);
    Response.status(200).entity(user);
  }
}

正如所料,我对HTTP GET的JSON响应返回User的所有属性,如下所示:

{
  "user_name": "John Doe",
  "user_email": "john_doe@johndoe.com",
  "user_type": "Admin",
  "user_tmp_password": "abc_xyz"
}

然而,我只想在JSON响应中返回一些属性:

{
  "user_name": "John Doe",
  "user_email": "john_doe@johndoe.com"
}

1 个答案:

答案 0 :(得分:3)

您始终可以返回部分填充的User对象,因为默认情况下,空值不会被编组。您甚至可以在retrieveUserFromDB方法中实现此功能,以避免复制步骤。

  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getUser(String Id) {
    // Pseudo-code for retrieving user
    User userFromDB = retrieveUserFromDB(user);
    User user = new User();
    user.setUserName(userFromDB.getUserName());
    user.setUserEmail(userFromDB.getUserEmail());
    Response.status(200).entity(user);
  }

了解更多信息