使用JAXB的部分对象?

时间:2013-05-16 14:24:52

标签: jaxb partial

我正在使用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可以毫不费力地处理整个对象。

干杯, 托比

1 个答案:

答案 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 {

了解更多信息