【发布时间】:2011-01-13 01:20:18
【问题描述】:
我正在使用 Jersey 为服务器组件创建 REST Web 服务。
我想在列表中序列化的带有 JAXB 注释的对象如下所示:
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
我有一个 REST 资源来检索一个如下所示的分布:
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
我还有一个 REST 资源来检索所有分发的列表,如下所示:
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
我使用一个ContextResolver来自定义JAXB序列化,目前是这样配置的:
@Provider
@Produces("application/json")
public class JAXBJSONContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
public JAXBJSONContextResolver() throws Exception {
JSONConfiguration.MappedBuilder b = JSONConfiguration.mapped();
b.nonStrings("id");
b.rootUnwrapping(true);
b.arrays("distribution");
context = new JSONJAXBContext(b.build(), XMLDistribution.class);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
return context;
}
}
REST 资源和上下文解析器都可以工作。这是第一个输出的示例:
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
}
这正是我想要的。这是列表的输出示例:
// path: /distributions
{
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
这不是我想要的。
我不明白为什么那里有一个封闭的distribution 标签。我想在上下文解析器中使用.rootUnwrapping(true) 删除它,但显然这只删除了另一个封闭标签。这是.rootUnwrapping(false) 的输出:
// path: /distribution/1
{
"distribution": {
"id": 1,
"name": "Example Distribution"
}
} // not ok
// path: /distributions
{
"xMLDistributions": {
"distribution": [{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
}
}
我还必须将 .arrays("distribution") 配置为始终获取 JSON 数组,即使只有一个元素。
理想情况下,我希望将其作为输出:
// path: /distribution/1
{
"id": 1,
"name": "Example Distribution"
} // currently works
// path: /distributions
[{
"id": 1,
"name": "Sample Distribution 1"
}, {
"id": 2,
"name": "Sample Distribution 2"
}]
我试图返回一个List<XMLDistribution>、一个XMLDistributionList(一个列表的包装)、一个XMLDistribution[],但我找不到以我所需格式获取一个简单的JSON分布数组的方法。
我还尝试了JSONConfiguration.natural()、JSONConfiguration.mappedJettison() 等返回的其他符号,但没有得到任何类似于我需要的东西。
有谁知道是否可以配置 JAXB 来执行此操作?
【问题讨论】:
标签: json jaxb serialization jersey jax-rs