我有两个Java对象,Company和Employee。它们都带有Jersey/JAXB注解,这样我就可以通过HTTP GET调用RESTful服务来获取它们。实际上,Company是Employee的"父"对象,我想在JSON响应中为子Employee列表提供一个属性的子集,如果获取Company,则只返回该子集。但是,当获取Employee本身时,我仍然希望返回所有Employee的属性。
我一直试图理解这一点,但是我不太确定如何做到这一点。这似乎很基础,但我没有在网上找到任何示例(也许我搜索了错误的内容)。
Company.java
现在,我有一个RESTful服务来获取Company对象和Employee对象的HTTP GET请求:
为了获取员工对象,所有属性都将被返回,正如预期的那样。因此它看起来像这样:
然而,它当然会以这样的形式返回 employees 列表中所有员工属性:
我一直试图理解这一点,但是我不太确定如何做到这一点。这似乎很基础,但我没有在网上找到任何示例(也许我搜索了错误的内容)。
Company.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...
}
Employee.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) {
//....
}
}
为了获取员工对象,所有属性都将被返回,正如预期的那样。因此它看起来像这样:
{
"employeeId": "1A2-B35",
"employeeName": "John Doe",
"employeeType": "Engineer"
}
当对公司对象执行GET时,我希望在公司对象下的员工列表中仅返回一些指定的员工属性(例如:仅返回员工姓名和员工ID)。因此,我期望的JSON响应应该类似于以下内容:
{
"companyName": "Acme",
"companyType": "Services",
"employees": [
{
"employeeId": "123_ABC",
"employeeName": "John Doe"
},
{
"employeeId": "456_XYZ",
"employeeName": "Jane Doe"
}
]
}
然而,它当然会以这样的形式返回 employees 列表中所有员工属性:
{
"companyName": "Acme",
"companyType": "Services",
"employees": [
{
"employeeId": "123_ABC",
"employeeName": "John Doe",
"employeeType": "Engineer"
},
{
"employeeId": "456_XYZ",
"employeeName": "Jane Doe",
"employeeType": "Executive"
}
]
}
只使用注释就能实现这个吗?还是除了创建自己的JSON对象之外,还有其他方法可以做到这一点?
XmlAdapter
类中。 然而,在调用HTTP GET Company时,Employee对象的布尔属性与我的其他编组属性一起出现。 所有我没有编组的其他属性都不会出现在响应中,这是预期的。 您知道为什么布尔属性可能会出现吗? - richsinn@XmlElement
的使用,是因为我实际上修改了每个元素的显示名称:即@XmlElement(name=EMPLOYEE_NAME_FIELD)
(只是上面的伪代码中没有写下来)。我想知道这是否会对我遇到的布尔问题产生影响。 - richsinnboolean
属性显示出来是因为它始终具有true
或false
的值。我的答案利用了JAXB默认行为来编组null值(请参见http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html)。您仍然可以利用这种方法,但是需要使用`XmlAdapter`将`Employee`转换为`AdaptedEmployee`而不是`Employee`。 - bdoughanXmlAdapter
将Employee
转换为AdaptedEmployee
而不是Employee
。”您建议的AdaptedEmployee
是否另一个扩展Employee
的类,然后在扩展的类上使用XmlAdapter
?(另外,我已默认使所有属性不可为空,因此对我来说,空值的编组不是问题)。 - richsinnboolean
属性更改为Boolean
(以支持空值),那么您可以创建一个AdaptedEmployee
类(它不应扩展Employee
),以便与XmlAdapter
一起使用(请参见http://blog.bdoughan.com/2010/12/jaxb-and-immutable-objects.html)。 - bdoughan