3

我想根据请求和用户有选择地序列化字段。

例如,将为管理员用户提供带有一些附加字段的 XML。而普通用户会得到一个没有这些字段的 XML。

其次,目前我@XmlIDREF用来防止引用对象或集合的不必要的扩展。

但有时用户可能想要这些详细信息。对引用的对象进行第二次请求是不可取的。我想让用户告诉服务器应该扩展 XYZ 属性(即包括完整的对象而不仅仅是它的引用)

给定一个用户和一个请求,根据业务逻辑,我可以判断哪些字段应该被序列化。现在如何将此信息传达给 JAXB?

尽可能地,我不想创建 XSD。请注意,请求参数是动态的。要序列化哪些字段是在运行时决定的。所以我不能使用必须硬编码的东西——比如@Transient注释@XmlIDREF

4

2 回答 2

2

我也不会尝试深入研究 XSD。这是我的建议:

1- 默认情况下,JAXB 不应序列化空字段。所以你可以简单地使字段无效,你不想序列化。

为了更干净一点,我建议您取消业务对象的副本。只是为了确保您不会在应用程序中产生副作用。


2-您还可以使用地图和存储使您的字段动态化<String, Object>。这将使您可以完全控制字段的生命周期。

编辑:键是你的变量名,值是你的对象引用。如果您的值应该是原始值,那么您可以将值自动装箱到关联的对象容器中。然后,JAXB 将序列化映射中的所有现有值。

如果您必须在多个类之间共享键定义,我建议您将 (key, value) 的创建/销毁封装到另一个类中。


3-如果您想强制执行一组特定的属性,这些属性可以同时为空或不为空,并且以下抽象对您的应用程序有意义。您还可以定义具有不同属性的子类的子集。父类将具有必须具有的属性。

祝你好运

于 2013-05-11T10:32:47.633 回答
2

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

在 EclipseLink 2.5(在此处获取:http: //www.eclipse.org/eclipselink/downloads/milestones.php)中,我们向 MOXy JAXB 添加了一个名为 Object Graphs 的新功能。对象图允许以编程方式或通过元数据选择要编组/解组的属性子集。下面是创建对象图以从 、 和 模型中获取数据子集CustomerAddress示例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);

了解更多信息

于 2013-05-11T11:18:45.643 回答