1

「セレクター」がリクエストで送信された場合、少数の XmlElements のみを返す必要がある RESTful サービスがあります。URL は次の形式になります。

/merchants/{merchantId}/profile?selectors=<field1|field2|....|fieldN>

{merchantId}セレクターはオプションです。これまでのところ、セレクターを指定せずに返される要素の完全なセットのサービスを実装しました。今、この追加機能を追加する方法を見つけようとしています。これはドキュメントでカバーされていると確信していますが、どこを見つけることができません。RTFMのポインタをいただければ幸いです。ありがとう。

4

2 に答える 2

2

EclipseLink JAXB (MOXy)は現在、マーシャル操作ごとに含まれるフィールド/プロパティを選択的に示すメカニズムを提供していません。これは興味深い使用例のように思えます。次のリンクを使用して、機能強化のリクエストとしてこれを入力していただければ幸いです。

以下は、値が null の場合に JAXB (JSR-222)XmlAdapterが要素をマーシャリングしないという事実を利用して、ステートフルを使用してこのユース ケースを実装する方法の例です( http://blog.bdoughan.comを参照)。 /2012/04/binding-to-json-xml-handling-null.html )。

フィールドアダプタ

ステートフルな XmlAdapter を利用するので、フィールドごとに 1 つ必要になります。すべての XmlAdapter が同じロジックを実行するため、他のものから拡張できるスーパー クラスを作成できます。

package forum13094195;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class FieldAdapter<T> extends XmlAdapter<T, T> {

    private boolean include;

    public FieldAdapter() {
        this.include = true;
    }

    public FieldAdapter(boolean include) {
        this.include = include;
    }

    @Override
    public T marshal(T value) throws Exception {
        if(include) {
            return value;
        }
        return null;
    }

    @Override
    public T unmarshal(T value) throws Exception {
        return value;
    }

}

Field1Adapter

package forum13094195;

public class Field1Adapter extends FieldAdapter<String> {
    public Field1Adapter() {}

    public Field1Adapter(boolean include) {
        super(include);
    }
}

Field2Adapter

package forum13094195;

public class Field2Adapter extends FieldAdapter<Integer>{
    public Field2Adapter() {}

    public Field2Adapter(boolean include) {
        super(include);
    }
}

Field3Adapter

package forum13094195;

public class Field3Adapter extends FieldAdapter<String> {
    public Field3Adapter() {}

    public Field3Adapter(boolean include) {
        super(include);
    }
}

商人

@XmlJavaTypeAdapter注釈は、フィールド/プロパティで を指定するために使用されますXmlAdapter

package forum13094195;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Merchant {

    @XmlJavaTypeAdapter(Field1Adapter.class)
    String field1;

    @XmlJavaTypeAdapter(Field2Adapter.class)
    int field2;

    @XmlJavaTypeAdapter(Field3Adapter.class)
    String field3;

}

デモ

以下のデモ コードは、 にステートフルを設定する方法を示してXmlAdapterMarshallerます。

package forum13094195;

import javax.xml.bind.*;

public class Demo {

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

        Merchant merchant = new Merchant();
        merchant.field1 = "A";
        merchant.field2 = 2;
        merchant.field3 = "C";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(merchant, System.out);

        marshaller.setAdapter(new Field1Adapter(false));
        marshaller.setAdapter(new Field2Adapter(false));
        marshaller.setAdapter(new Field3Adapter(true));
        marshaller.marshal(merchant, System.out);
    }

}

出力

以下は、デモ コードを実行した結果の出力です。デフォルトでは、オブジェクト全体がマーシャリングされます。マーシャリングされた 2 番目のドキュメントには、除外したフィールドが含まれていません。

<?xml version="1.0" encoding="UTF-8"?>
<merchant>
   <field1>A</field1>
   <field2>2</field2>
   <field3>C</field3>
</merchant>
<?xml version="1.0" encoding="UTF-8"?>
<merchant>
   <field3>C</field3>
</merchant>
于 2012-10-30T20:16:22.437 に答える