我正在使用JAX-RS创建一些服务,并且对于JAXB(实际上是XML)来说相对较新,所以请不要假设我知道我可能应该知道的先决条件!这是问题:我想用XML发送和接收“部分”对象。也就是说,假设有一个对象(显然是Java形式):
class Thing {int x,String y,Customer z}
我希望能够发送一个XML输出,其中包含(动态选择,因此我不能使用XmlTransient)x,或只是z,或x和y,但不是z,或任何其他适合我的组合客户。显然,关键是有时客户端并不需要所有东西,所以我可以节省一些带宽(特别是对于深层复杂对象的列表,这个例子显然没有说明!)。
此外,对于输入,应用相同的带宽参数;我希望能够让客户端只发送应该更新的特定字段,比如PUT操作,并忽略其余的,然后让服务器将这些新值“合并”到现有对象上并保留un-提到的字段不变。
这似乎在Jackson JSON库中得到了支持(虽然我还在努力)但是我在JAXB中找不到它。有什么想法吗?
有人认为我在思考是否可以通过地图以某种方式做到这一点。如果我创建了一个Map(可能嵌套的地图,对于嵌套的coplex对象)我想要发送的内容,那么JAXB可以使用合理的结构发送它吗?如果它可以在输入上创建这样的地图,我想我可以通过它来进行更新。不完美,但也许?
是的,我知道将要飞来飞去的“文件”可能无法遵守模式,缺少字段和所有这些,但我很好,只要基础设施可以工作。
哦,我知道我可以使用SAX,StAX或DOM解析“手动”执行此操作,但我希望有一种更自动的方式,特别是因为JAXB可以毫不费力地处理整个对象。
干杯, 托比
答案 0 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
EclipseLink JAXB(MOXy)通过其对象图扩展提供此支持。对象图允许您指定属性的子集,以便编组解组。它们可以在运行时以编程方式创建:
// Create the Object Graph
ObjectGraph contactInfo = JAXBHelper.getJAXBContext(jc).createObjectGraph(Customer.class);
contactInfo.addAttributeNodes("name");
Subgraph location = contactInfo.addSubgraph("billingAddress");
location.addAttributeNodes("city", "province");
Subgraph simple = contactInfo.addSubgraph("phoneNumbers");
simple.addAttributeNodes("value");
// Output XML - Based on Object Graph
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, contactInfo);
marshaller.marshal(customer, System.out);
或通过注释静态上课:
@XmlNamedObjectGraph(
name="contact info",
attributeNodes={
@XmlNamedAttributeNode("name"),
@XmlNamedAttributeNode(value="billingAddress", subgraph="location"),
@XmlNamedAttributeNode(value="phoneNumbers", subgraph="simple")
},
subgraphs={
@XmlNamedSubgraph(
name="location",
attributeNodes = {
@XmlNamedAttributeNode("city"),
@XmlNamedAttributeNode("province")
}
)
}
)
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
了解更多信息