2013-05-16 42 views
1

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

类的东西{INT X,y字符串,客户Z}

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

另外,对于输入,应用相同的带宽参数;我希望能够让客户端只发送应该更新的特定字段,例如PUT操作,并忽略其余部分,然后让服务器将这些新值合并到现有对象上,上述领域不变。

这似乎在杰克逊的JSON库支持(虽然我仍在努力),但我无法在JAXB中找到它。有任何想法吗?

有人认为我在思考是否可以通过地图以某种方式做到这一点。如果我为我想发送的内容创建一个Map(嵌套的coplex对象的潜在嵌套地图),那么JAXB是否可以用一个似是而非的结构发送它?如果它可以创建这样的输入地图,我想我可以通过它来完成更新。不完美,但也许?

是的,我知道将要飞来飞去的“文档”可能不符合模式,缺少字段和所有这些,但是我可以做到这一点,只要基础架构可以工作。

呵呵,我知道我可以用SAX,StAX或DOM解析来“手动”这样做,但我希望有一种更自动的方式,尤其是因为JAXB能够毫不费力地处理整个对象。

干杯, 托比

回答

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 { 

更多信息

+0

谢谢,我想在您的凭据隐含的是信心的保证是没有标准的方式,这同时令人失望的比想了解更知道!我会看看我是否可以将该项目移至EclipseLink。 非常感谢! –