注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。
このユース ケースを処理するために、EclipseLink 2.5 で MOXy に追加したオブジェクト グラフ拡張機能を使用できます。次の場所からナイトリー ビルドをダウンロードできます。
クラスA
MOXy のオブジェクト グラフ拡張機能を使用して、マーシャリングできる値のサブセットを指定します。
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;
@XmlRootElement
@XmlNamedObjectGraph(
name="deleted",
attributeNodes = {
@XmlNamedAttributeNode("objectId"),
@XmlNamedAttributeNode("status")
}
)
public class ClassA {
public long objectId;
public String status;
public String property1;
}
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
デモ
以下のデモ コードでは、 on のインスタンスが に等しい場合にMarshallerProperties.OBJECT_GRAPH
プロパティをdeleted
on に設定します。Marshaller
status
ClassA
deleted
import java.util.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.MarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {ClassA.class}, properties);
ClassA classA = new ClassA();
classA.objectId = 1;
classA.property1 = "value1";
classA.status = "new";
marshal(jc, classA);
classA.status = "deleted";
marshal(jc, classA);
}
private static void marshal(JAXBContext jc, ClassA classA) throws Exception {
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
if("deleted".equals(classA.status)) {
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "deleted");
}
marshaller.marshal(classA, System.out);
}
}
出力
以下は、デモ コードを実行した結果の出力です。が値status
と等しい場合、マーシャリングされません。deleted
property1
{
"objectId" : 1,
"status" : "new",
"property1" : "value1"
}
{
"objectId" : 1,
"status" : "deleted"
}
このユースケースをさらに簡単に処理できるようにするために、次の拡張リクエストを開きました。