我有以下课程
@XmlRootElement
public class Test {
@XmlTransient
private String abc;
@XmlElement
private String def;
}
我的问题是,我想使用这个类来生成两种XML
1. With <abc>
2. without <abc>
我可以实现第二个,因为我已将其标记为瞬态。有没有办法让我把“abc”标记为@XMLElement
并在编组时可以忽略它?
提前致谢
答案 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>
了解更多信息