1

我正在使用 JAX-RS 创建一些服务,并且对 JAXB(实际上是一般的 XML)相对较新,所以请不要假设我知道我可能应该知道的先决条件!问题如下:我想在 XML 中发送和接收“部分”对象。也就是说,假设一个对象(显然是 Java 形式)具有:

类事物 { int x,字符串 y,客户 z }

我希望能够发送一个 XML 输出,其中包含(动态选择,因此我不能使用 XmlTransient)仅 x,或仅 z,或 x 和 y,但不包含 z,或任何其他适合我的客户的组合。显然,重点是有时客户端不需要所有东西,所以我可以节省一些带宽(特别是对于深度复杂对象的列表,这个例子显然没有说明!)。

此外,对于输入,同样的带宽参数适用;我希望能够让客户端只发送应该在 PUT 操作中更新的特定字段,而忽略其余部分,然后让服务器将这些新值“合并”到现有对象上并保留未提到的字段不变。

这似乎在 Jackson JSON 库中得到支持(尽管我仍在研究它),但我在 JAXB 中找不到它。有任何想法吗?

我正在思考的一个想法是,是否可以通过地图以某种方式做到这一点。如果我创建了一个我想要发送的地图(可能是嵌套的地图,用于嵌套的复杂对象),JAXB 可以用一个合理的结构发送它吗?如果它可以在输入上创建这样的地图,我想我可以通过它来进行更新。不完美,但也许?

是的,我知道到处飞来飞去的“文档”可能会不符合模式,缺少字段等等,但我可以接受,前提是基础设施可以正常工作。

哦,我知道我可以使用 SAX、StAX 或 DOM 解析“手动”执行此操作,但我希望有一种更自动化的方法,特别是因为 JAXB 可以毫不费力地处理整个对象。

干杯,托比

4

1 回答 1

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 {

了解更多信息

于 2013-05-16T14:38:52.920 回答