1

私は次のようなクラスを持っています:

@XmlRootElement 
Class ClassA {

public long objectId;

public String status;

public String property1;

......
}

そして、JAXB の JSON 出力をプロパティ「ステータス」で条件付けしたいと考えています。元:

if status != "deleted" -> すべてのフィールドをバインド

{"objectId":1,"status":"new","property1":"value1","property2":"value2","prop3":"val3"....}

if status == "deleted" -> 2 つのフィールドのみをバインド

{"objectsId":1,"status":"deleted"}

JAXBでそれを行うことは可能ですか??? ありがとう

4

1 に答える 1

3

注: 私は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プロパティをdeletedon に設定します。MarshallerstatusClassAdeleted

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と等しい場合、マーシャリングされません。deletedproperty1

{
   "objectId" : 1,
   "status" : "new",
   "property1" : "value1"
}
{
   "objectId" : 1,
   "status" : "deleted"
}

このユースケースをさらに簡単に処理できるようにするために、次の拡張リクエストを開きました。

于 2013-04-23T20:26:34.957 に答える