2

是否有 JAXB 注释允许我们使用枚举隐藏某些值?

例如,如果我想在以下枚举中隐藏值 BLUE:

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

有没有办法按照规范做到这一点?

编辑:一些评论者提到这样做没有意义。我(恭敬地)不同意。在 JAXB/Web 服务领域有这样的先例。这是我正在考虑的情况:

使用 Java-First Web 服务设计,类和枚举被直接转换为 XSD 并通过 Web 服务公开。现在可能存在我们想要从 Web 服务中隐藏某些(敏感?)数据的情况,但让库可以直接访问代码。对于类字段,JAXB 提供了一个 @XmlTransient 注释来隐藏不应通过 Web 服务公开的字段 - 它只表明枚举值也可能存在这种需求。

4

1 回答 1

1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB 2 (JSR-222)专家组的成员。

以下示例适用于 EclipseLink JAXB (MOXy),但似乎在我正在使用的 JDK (Oracle JDK 1.6.0_29) 中包含的 JAXB 版本引发异常。

颜色适配器

我使用 aXmlAdapterenum值转换为 a String。如果值是,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();
    }

}

颜色

XmlAdapter是使用@XmlJavaTypeAdapter注解注册的。如果您希望将适配器应用于所有实例,COLOR则可以在COLOR枚举本身上指定适配器。

package forum10192641;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlJavaTypeAdapter(COLORAdapter.class)
public enum COLOR {
    RED,
    YELLOW,
    GREEN,
    BLUE
 }

下面是一个具有三个 type 属性的域类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 回答