2012-04-17 4 views
1

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

私は、次の列挙型の値BLUEを非表示にしたい場合は、:

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

スペックごとにこれを行う方法はありますか?

編集: コメントした人の中には、やりたくないものがあります。私(敬意を表する)は同意しない。これはJAXB/Webサービスの世界で先例があります。

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

+0

私はそうは思わない、それは意味をなさない。 – khmarbaise

+0

プロパティを文字列として公開し、enumを取得するヘルパーメソッドを使用できます。これはすべてのenum値を隠すでしょう。 –

+0

デザイン上の問題があります。 – JMelnik

答えて

1

注:私はEclipseLink JAXB (MOXy)の鉛とJAXB 2 (JSR-222)専門家のメンバーです。

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

COLORAdapter

IはStringenum値を変換する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>