注:私はEclipseLink JAXB (MOXy)の鉛とJAXB 2 (JSR-222)専門家のメンバーです。
次の例は、EclipseLink JAXB(MOXy)では機能しますが、使用しているJDKに含まれるJAXBのバージョン(Oracle JDK 1.6.0_29)で例外がスローされているようです。
COLORAdapter
IはString
にenum
値を変換するXmlAdapter
を使用します。値がBLUE
の場合、nullをString
の値として返しました。これにより、JAXBは対応するノードをマーシャリングしません。
package forum10192641;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class COLORAdapter extends XmlAdapter<String, COLOR> {
@Override
public COLOR unmarshal(String v) throws Exception {
return COLOR.valueOf(v);
}
@Override
public String marshal(COLOR v) throws Exception {
if(v == COLOR.BLUE) {
return null;
}
return v.name();
}
}
COLOR
XmlAdapter
は@XmlJavaTypeAdapter
アノテーションを使用して登録されています。アダプターをすべてのインスタンスCOLOR
に適用する場合は、COLOR
列挙型アダプターでアダプターを指定できます。
package forum10192641;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Foo {
private COLOR color1;
private COLOR color2;
private COLOR color3;
public COLOR getColor1() {
return color1;
}
public void setColor1(COLOR color1) {
this.color1 = color1;
}
public COLOR getColor2() {
return color2;
}
public void setColor2(COLOR color2) {
this.color2 = color2;
}
public COLOR getColor3() {
return color3;
}
public void setColor3(COLOR color3) {
this.color3 = color3;
}
}
JAXB:以下のFoo
はタイプCOLOR
の3つのプロパティを持つドメインクラスです。プロパティ
次のエントリを持つドメインモデルと同じパッケージでjaxb.properties
という名前のファイルをインクルードする必要があり、あなたのJAXBプロバイダとしてMOXYを指定:
javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory
デモ
package forum10192641;
import javax.xml.bind.*;
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.setColor1(COLOR.GREEN);
foo.setColor2(COLOR.BLUE);
foo.setColor3(COLOR.RED);
marshaller.marshal(foo, System.out);
}
}
出力
以下はデモコードを実行した結果です。
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<color1>GREEN</color1>
<color3>RED</color3>
</foo>
私はそうは思わない、それは意味をなさない。 – khmarbaise
プロパティを文字列として公開し、enumを取得するヘルパーメソッドを使用できます。これはすべてのenum値を隠すでしょう。 –
デザイン上の問題があります。 – JMelnik