我有一个要求,根据字段上标记的自定义注释对 java pojo 的某些元素进行编组/解组。假设我的 java pojp 中有 3 个字段
@CustomVersion("v1")
private String field1;
@CustomVersion("v1","v2")
private String field2;
@CustomVersion("v2")
private String field3;
Run Code Online (Sandbox Code Playgroud)
如果我在 jaxb 中转换时传递 version="v1" 参数,我只想编组带有 v1 的字段。如果我通过 v2,所有带有 v2 注释的字段应该只被编组。
甚至可以使用 jaxb 吗?我确信选择性编组会通过某些库或方式得到支持,经过相当多的搜索后我仍然无法弄清楚。任何帮助、建议或指示都受到高度赞赏。
注意: 我是EclipseLink JAXB (MOXy) 的负责人和JAXB (JSR-222)专家组的成员。
下面是一个示例,说明如何使用 MOXy 的@XmlNamedObjectGraphs扩展来映射您的用例。
富
该@XmlNamedObjectGraphs扩展允许您指定由一个键标识的多个映射子集。
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlNamedAttributeNode;
import org.eclipse.persistence.oxm.annotations.XmlNamedObjectGraph;
import org.eclipse.persistence.oxm.annotations.XmlNamedObjectGraphs;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlNamedObjectGraphs({
@XmlNamedObjectGraph(
name="v1",
attributeNodes = {
@XmlNamedAttributeNode("field1"),
@XmlNamedAttributeNode("field2")}),
@XmlNamedObjectGraph(
name="v2",
attributeNodes = {
@XmlNamedAttributeNode("field2"),
@XmlNamedAttributeNode("field3")})
})
public class Foo {
private String field1 = "ONE";
private String field2 = "TWO";
private String field3 = "THREE";
}
Run Code Online (Sandbox Code Playgroud)
jaxb.properties
要将 MOXy 用作您的 JAXB 提供程序,您需要包含一个jaxb.properties使用以下条目调用的文件(请参阅:http : //blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
演示
您可以指定与对象图对应的键,以便将该子集应用于您正在编组的对象。
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.jaxb.MarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Foo foo = new Foo();
// Marshal Everything
marshaller.marshal(foo, System.out);
// Marshal "v1" Data
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "v1");
marshaller.marshal(foo, System.out);
// Marshal "v2" Data
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "v2");
marshaller.marshal(foo, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
输出
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<field1>ONE</field1>
<field2>TWO</field2>
<field3>THREE</field3>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<field1>ONE</field1>
<field2>TWO</field2>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<field2>TWO</field2>
<field3>THREE</field3>
</foo>
Run Code Online (Sandbox Code Playgroud)