java - Jersey/JAXB : Use same POJO for HTTP POST and GET, 但在 JSON 响应中仅返回 GET 属性的子集。

标签 java json jaxb jersey jax-rs

这似乎是另一件相当简单的事情,但我又在为如何去做而苦苦挣扎。

我有一个 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"
}

最佳答案

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

了解更多信息

关于java - Jersey/JAXB : Use same POJO for HTTP POST and GET, 但在 JSON 响应中仅返回 GET 属性的子集。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107874/

相关文章:

java - 为什么不直接调用animatorset的cancel方法,animator到底是什么?

java - IllegalArgumentException : negative width in kabeja 的原因是什么

python - 如何将 JSON 中的推文保存到 Python 3.4 中的 txt 文件?

java - Spring @RequestBody 覆盖

java - Jaxb:通过 xmlns 属性而不是元素前缀进行本地命名空间?

java - 无法移除组件并重新绘制

Java计算方法返回1.0而不是0.5?做什么?

javascript - 使用 PHP 从 JSON 检索数组

sql - 具有动态列的透视 SQL 表

JAXB 和 Java 1.6 的 Java 错误