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

2024-02-16

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

我有一个带有 Jersey/JAXB 注释的 POJO,该注释具有与其关联的 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": "[email protected] /cdn-cgi/l/email-protection",
  "user_type": "Admin",
  "user_tmp_password": "abc_xyz"
}

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

{
  "user_name": "John Doe",
  "user_email": "[email protected] /cdn-cgi/l/email-protection"
}

您始终可以返回部分填充的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);
  }

了解更多信息

  • http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey/JAXB:对 HTTP POST 和 GET 使用相同的 POJO,但在 JSON 响应中仅返回 GET 属性的子集。 的相关文章

随机推荐