Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何告诉JAXB在运行时序列化哪些字段?_Java_Xml_Jaxb_Jax Rs_Moxy - Fatal编程技术网

Java 如何告诉JAXB在运行时序列化哪些字段?

Java 如何告诉JAXB在运行时序列化哪些字段?,java,xml,jaxb,jax-rs,moxy,Java,Xml,Jaxb,Jax Rs,Moxy,我希望根据请求和用户有选择地序列化字段 例如,管理员用户将获得一个带有一些附加字段的XML。而普通用户在没有这些字段的情况下会得到XML 其次,目前我使用@XmlIDREF来防止引用对象或集合的不必要扩展 但有时用户可能需要这些详细信息。对引用对象发出第二个请求是不可取的。我想让用户告诉服务器应该扩展XYZ属性(即包括完整的对象,而不仅仅是它的引用) 给定一个用户和一个请求,我可以根据业务逻辑判断哪些字段应该序列化。现在我如何将这些信息传达给JAXB 尽可能地,我不想创建XSD。请注意,请求参数

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

例如,管理员用户将获得一个带有一些附加字段的XML。而普通用户在没有这些字段的情况下会得到XML

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

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

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


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

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

1-默认情况下,JAXB不应序列化空字段。 因此,您可以简单地将字段置零,而不希望序列化

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


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

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

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


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


祝你好运。

注意:我是专家组的组长和成员

在EclipseLink 2.5(在这里获取:)中,我们向MOXy JAXB添加了一个新特性,称为对象图。对象图允许以编程方式或通过元数据选择要封送/解封送的属性子集。下面是创建对象图以从
客户
地址
电话号码
模型获取数据子集的示例

    // 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);
了解更多信息


谢谢。我想做一些类似于第一点的事情。但是它不是很整洁。比如说,对象A引用B。我显然不会在引用B时使用XmlIDREF,因为它会阻止B被扩展。但现在,当我不想扩展B时,我必须将B的所有字段都设置为null,除了包含ID的字段。这不是很漂亮,但可以做到,到目前为止,看起来是最好的选择。你能详细说明第二点吗?我在下面详细说明了第二点。这也是一种非常基本的方法。如果您感兴趣,您可以搜索其他方法来实现“动态字段”()谢谢,这很好。效果很好。但是,我在子图中的ID字段封送方面有一些问题。我有一个类a的对象列表(包装在JaxbList中)。类A的每个对象依次具有类B的对象列表。我通过传递给JaxbList.class来创建对象图。由此,我为B创建了一个子图。a按预期序列化,但子图的ID字段未序列化。如果我尝试通过将B作为主图(而不是子图)来封送处理,则ID字段将按预期进行序列化。你知道会出什么问题吗?我尝试注释XmlID注释。这种情况仍然存在。