4

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

我有一个 POJO,带有 Jersey/JAXB 注释,它具有与之关联的 HTTP POST 和 GET 方法。在 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"
}
4

1 回答 1

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);
  }

了解更多信息

于 2012-06-19T20:01:52.417 回答