带有自定义注释的 Jaxb 编组

Ash*_*ral 2 java xml jaxb

我有一个要求,根据字段上标记的自定义注释对 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 吗?我确信选择性编组会通过某些库或方式得到支持,经过相当多的搜索后我仍然无法弄清楚。任何帮助、建议或指示都受到高度赞赏。

bdo*_*han 5

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

下面是一个示例,说明如何使用 MOXy 的@XmlNamedObjectGraphs扩展来映射您的用例。

Java模型

@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)

想要查询更多的信息