我想根据请求和用户有选择地序列化字段。
例如,管理员用户将获得带有一些其他字段的XML。普通用户在没有这些字段的情况下会获得XML。
其次,目前我使用@XmlIDREF
来防止不必要地扩展引用的对象或集合。
但有时用户可能会想要这些细节。不希望对引用的对象做出第二次请求。我想让用户告诉服务器应该扩展XYZ属性(即包括完整的对象,而不仅仅是它的引用)
根据用户和请求,基于业务逻辑,我可以告诉哪些字段应该被序列化。现在我该如何将这些信息传达给JAXB?
尽可能地,我不想创建XSD。请注意,请求参数是动态的。要在运行时确定要序列化的字段。所以我不能使用必须进行硬编码的内容 - 例如@Transient
或@XmlIDREF
注释。
答案 0 :(得分:2)
我也不会试图深入研究XSD。在这里,我的建议是:
1-默认情况下,JAXB不应序列化空字段。 所以你可以简单地使字段无效,你不想序列化。
为了更清洁,我建议您取消业务对象的副本。只是为了确保你不会在应用程序中产生副作用。
2-您还可以使用地图动态创建字段并存储<String, Object>
。
这样您就可以完全控制字段的生命周期。
编辑:键将是您的变量名称,该值将是您的对象引用。如果您的值应该是原始值,那么您可以将值自动装入关联的对象容器中。 然后,JAXB将序列化地图中的所有现有值。
如果必须跨多个类共享密钥定义,我建议您将(key,value)的创建/销毁封装到另一个类中。
3-如果要强制执行一组特定的属性,这些属性可以同时为null或不同,并且以下抽象对您的应用程序有意义。 您还可以定义具有不同属性的子类的子集。父类将具有必须具有的属性。
祝你好运答案 1 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
在EclipseLink 2.5中(在此处获取:http://www.eclipse.org/eclipselink/downloads/milestones.php),我们向MOXy JAXB添加了一个名为Object Graphs的新功能。对象图允许以编程方式或通过元数据选择要编组/解组的属性子集。以下是创建对象图以从Customer
,Address
和PhoneNumber
模型获取数据子集的示例。
// 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);
了解更多信息