java - 对于 Jersey/JAXB,是否可以使用与 'parent' 和 'child' 相同的 POJO,但在用作 'child' 时删除某些属性?

标签 java json jaxb jersey jax-rs

我有两个 Java 对象,Company 和 Employee。它们都带有 Jersey/JAXB 注释,因此我可以调用 RESTful 服务来 HTTP GET 它们。本质上,Company 是 Employee 的“父”对象,如果为 Company 执行 GET,我想做的是只为 JSON 响应中的 Employees 子列表提供属性的子集。但是,在为 Employee 本身执行 GET 时,我仍然想返回 Employee 的所有属性。

我一直在努力解决这个问题,但我不太确定该怎么做。这看起来很基本,但我无法在网上找到任何示例(也许我在谷歌搜索错误的东西)。

公司.java

@XmlRootElement
public class Company {
  private String companyName;
  private String companyType;
  private List<Employee> employees = new ArrayList<Employee>();

  // getters and setters with @XmlElement on each attribute 
  //...etc...
  @XmlElement
  public List<Employee> getEmployees() {
    return employees;
  }
  //...etc...
}

员工.java

@XmlRootElement
public class Employee{
  private String employeeId;
  private String employeeName;
  private String employeeType;

  // getters and setters with @XmlElement on each attribute
  //...etc...
  @XmlElement
  public String getEmployeeId() {
    return employeeId;
  }
  //...etc...
}

现在,我有一个 RESTful 服务来对 Company 对象和 Employee 对象执行 HTTP GET:

public class infoService{
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getCompany(String Id) {
  //....
  }

  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Response getEmployee(String Id) {
  //....
  }
}

对于获取 Employee 对象,如预期的那样返回所有属性。所以它看起来像这样:

{
  "employeeId": "1A2-B35",
  "employeeName": "John Doe",
  "employeeType": "Engineer"
}

当为 Company 对象执行 GET 时,我希望 Company 对象下的 Employees 列表仅返回 Employee 的几个指定属性(即仅员工姓名和员工 ID)。因此,我想要的 JSON 响应看起来像这样:

{
  "companyName": "Acme",
  "companyType": "Services",
  "employees": [
    {
      "employeeId": "123_ABC",
      "employeeName": "John Doe"
    },
    {
      "employeeId": "456_XYZ",
      "employeeName": "Jane Doe"
    }
  ]
}

但是,当然,它会返回员工列表中的所有员工属性,如下所示:

{
  "companyName": "Acme",
  "companyType": "Services",
  "employees": [
    {
      "employeeId": "123_ABC",
      "employeeName": "John Doe",
      "employeeType": "Engineer"
    },
    {
      "employeeId": "456_XYZ",
      "employeeName": "Jane Doe",
      "employeeType": "Executive"
    }
  ]
}

是否可以仅使用注释来做到这一点?或者除了创建我自己的 JSON 对象之外,还有其他方法可以做到这一点吗?

最佳答案

您可以使用 XmlAdapter 来解决这个用例:

员工适配器

XmlAdapter 会将完全填充的 Employee 转换为另一个实例,其中只填充了您想要编码为 XML 的字段。由于这是一个副本,因此不会影响原始对象模型。

package forum11059499;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class EmployeeAdapter extends XmlAdapter<Employee, Employee>{

    @Override
    public Employee marshal(Employee employee) throws Exception {
        Employee partialEmployee = new Employee();
        partialEmployee.setEmployeeId(employee.getEmployeeId());
        partialEmployee.setEmployeeName(employee.getEmployeeName());
        return partialEmployee;
    }

    @Override
    public Employee unmarshal(Employee employee) throws Exception {
        return employee;
    }

}

公司

@XmlJavaTypeAdapter 注释用于指定所需属性的 XmlAdapter

package forum11059499;

import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Company {
    private String companyName;
    private String companyType;
    private List<Employee> employees = new ArrayList<Employee>();

    // getters and setters with @XmlElement on each attribute
    // ...etc...
    @XmlElement
    @XmlJavaTypeAdapter(EmployeeAdapter.class)
    public List<Employee> getEmployees() {
        return employees;
    }
    // ...etc...
}

了解更多信息


我注意到您的代码中有以下注释:

// getters and setters with @XmlElement on each attribute

因为 JAXB (JSR-222) 实现是通过异常配置的,所以您只需在需要默认 XML 表示的地方添加注释。这意味着您可以删除模型中的一些注释:

关于java - 对于 Jersey/JAXB,是否可以使用与 'parent' 和 'child' 相同的 POJO,但在用作 'child' 时删除某些属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059499/

相关文章:

json - 以 JSON 格式访问(新型、公共(public))Google 工作表

java - JAXB 文档注释

java - 404 与 response.sendRedirect

java - Dropwizard:处理多个 dropwizard 实例

json - 组的 Firebase 数据库规则

xml - JAXB 和多态性

java - 将 Java ENUM 转换为 XML

Java 枚举属性最佳实践

Java - 无法编辑字节数组内容?

ios - 将 JSON 解析为 TableView