2

列挙型で特定の値を非表示にできる JAXB アノテーションはありますか?

たとえば、次の列挙型で値 BLUE を非表示にしたい場合:

public enum COLOR {
   RED,
   YELLOW,
   GREEN,
   @SomeAnnotation
   BLUE
}

仕様ごとにこれを行う方法はありますか?

編集:一部のコメンターは、これはやりたいことが意味をなさないと述べました。私は(丁重に)同意しません。これには、JAXB/Web サービスの世界で前例があります。私が考えている状況は次のとおりです。

Java-First Web Service Design を使用すると、クラスと列挙型が直接 XSD に変換され、Web サービスを介して公開されます。特定の (機密性の高い?) データを Web サービスから隠したい場合があるかもしれませんが、ライブラリがコードに直接アクセスできるように残しておきます。クラス フィールドの場合、JAXB は @XmlTransient アノテーションを提供して、Web サービス経由で公開してはならないフィールドを非表示にします。これは、enum 値にもこの必要性が存在する可能性があるということになります。

4

1 に答える 1

1

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB 2 (JSR-222)エキスパート グループのメンバーです。

次の例は、EclipseLink JAXB (MOXy) で動作しますが、使用している JDK (Oracle JDK 1.6.0_29) に含まれる JAXB のバージョンで例外をスローするようです。

COLORアダプター

値をXmlAdapterに変換するために を使用しました。値が次の場合、値として null を返しました。これにより、JAXB は対応するノードをマーシャリングしません。enumStringBLUEString

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>
于 2012-04-17T16:08:58.353 に答える