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;
}
デモ
以下のデモ コードは、 にステートフルを設定する方法を示してXmlAdapter
いMarshaller
ます。
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>