我有两个 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...
}
了解更多信息
- http://blog.bdoughan.com/search/label/XmlAdapter
- http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html
我注意到您的代码中有以下注释:
// 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/