注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB 2 (JSR-222)エキスパート グループのメンバーです。
次の例は、EclipseLink JAXB (MOXy) で動作しますが、使用している JDK (Oracle JDK 1.6.0_29) に含まれる JAXB のバージョンで例外をスローするようです。
COLORアダプター
値をXmlAdapter
に変換するために を使用しました。値が次の場合、値として null を返しました。これにより、JAXB は対応するノードをマーシャリングしません。enum
String
BLUE
String
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();
}
}
色
は注釈XmlAdapter
を使用して登録されます。@XmlJavaTypeAdapter
のすべてのインスタンスにアダプタを適用する場合は、列挙型自体COLOR
でアダプタを指定できます。COLOR
package forum10192641;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlJavaTypeAdapter(COLORAdapter.class)
public enum COLOR {
RED,
YELLOW,
GREEN,
BLUE
}
フー
以下は、 type の 3 つのプロパティを持つドメイン クラスです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.properties
MOXy を JAXB プロバイダーとして指定するにはjaxb.properties
、次のエントリを使用して、ドメイン モデルと同じパッケージに名前が付けられたファイルを含める必要があります。
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>