JAXB忽略处理中的字段

时间:2013-02-26 21:37:32

标签: jaxb

我有以下课程

@XmlRootElement
public class Test {

    @XmlTransient
    private String abc;

    @XmlElement
    private String def;

}

我的问题是,我想使用这个类来生成两种XML

1. With <abc>
2. without <abc>

我可以实现第二个,因为我已将其标记为瞬态。有没有办法让我把“abc”标记为@XMLElement并在编组时可以忽略它?

提前致谢

1 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

您可能对我们在EclipseLink 2.5.0中添加的@XmlNamedObjectGraph扩展感兴趣。它允许您在域模型上定义多个视图。你今天可以尝试使用每晚构建:

下面我举一个例子:

<强>测试

@XmlNamedObjectGraph注释用于定义在编组和解组时可以使用的对象图的子集。

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;

@XmlNamedObjectGraph(
    name="only def",
    attributeNodes = {
        @XmlNamedAttributeNode("def")
    }
)
@XmlRootElement
public class Test {

    private String abc;
    private String def;

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }

    public String getDef() {
        return def;
    }

    public void setDef(String def) {
        this.def = def;
    }

}

<强>演示

MarshallerProperties.OBJECT_GRAPH可用于指定应该编组哪个对象图。

import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Test.class);

        Test test = new Test();
        test.setAbc("FOO");
        test.setDef("BAR");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Marshal the Entire Object
        marshaller.marshal(test, System.out);

        // Marshal Only What is Specified in the Object Graph
        marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "only def");
        marshaller.marshal(test, System.out);
    }

}

<强>输出

以下是运行演示代码的输出。第一次编组Test的实例时,它包含所有属性,第二次只包含def属性。

<?xml version="1.0" encoding="UTF-8"?>
<test>
   <abc>FOO</abc>
   <def>BAR</def>
</test>
<?xml version="1.0" encoding="UTF-8"?>
<test>
   <def>BAR</def>
</test>

了解更多信息