EclipseLink 2.5.0 を使用している場合は、このユース ケースに MOXy の@XmlNamedObjectGraphs
拡張機能を利用できます。EclipseLink 2.5.0 リリース候補は、次のリンクからダウンロードできます。
ドメイン モデル (Foo)
この@XmlNamedObjectGraph
拡張機能を使用すると、マーシャリングとアンマーシャリングで使用できるマッピングのサブセットを指定できます。
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;
@XmlNamedObjectGraphs({
@XmlNamedObjectGraph(
name="a",
attributeNodes={
@XmlNamedAttributeNode("a"),
@XmlNamedAttributeNode("ab"),
@XmlNamedAttributeNode("ac")
}
),
@XmlNamedObjectGraph(
name="b",
attributeNodes={
@XmlNamedAttributeNode("ab"),
@XmlNamedAttributeNode("bc")
}
),
@XmlNamedObjectGraph(
name="c",
attributeNodes={
@XmlNamedAttributeNode("bc"),
@XmlNamedAttributeNode("c"),
@XmlNamedAttributeNode("ac")
}
)
})
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
int a;
int ab;
int bc;
int c;
int ac;
}
デモ
Foo
以下のデモ コードでは、定義したオブジェクト グラフを利用して の1 つのインスタンスを作成し、4 つの異なる方法で出力します。
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(Foo.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Foo foo = new Foo();
foo.a = 1;
foo.ab = 2;
foo.ac = 3;
foo.bc = 4;
foo.c = 5;
// Marshal to XML - Everything
marshaller.marshal(foo, System.out);
// Marshal to XML - Application A
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "a");
marshaller.marshal(foo, System.out);
// Marshal to JSON - Application B
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "b");
marshaller.marshal(foo, System.out);
// Marshal to JSON - Application C
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "c");
marshaller.marshal(foo, System.out);
}
}
出力
以下は、デモ コードから生成した 4 つの異なるビューです。Foo
同じデータを入力して、毎回まったく同じインスタンスをマーシャリングしたことを思い出してください。
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<a>1</a>
<ab>2</ab>
<bc>4</bc>
<c>5</c>
<ac>3</ac>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<a>1</a>
<ab>2</ab>
<ac>3</ac>
</foo>
{
"foo" : {
"ab" : 2,
"bc" : 4
}
}{
"foo" : {
"bc" : 4,
"c" : 5,
"ac" : 3
}
}
詳細については