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