2012-04-17 75 views
1

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

举例来说,如果我想隐藏以下枚举值BLUE:

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

有没有一种办法按规格做到这一点?

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

使用Java-Web服务设计,类和枚举直接转换为XSD并通过Web服务公开。现在可能会出现这种情况,我们希望从Web服务中隐藏某些(敏感的)数据,但将其保留用于直接访问代码的库。对于类字段,JAXB提供了一个@XmlTransient注解来隐藏不应该通过Web服务公开的字段 - 它只是因为这种需求也可以存在于枚举值。

+0

我不这么认为,因为它没有任何意义。 – khmarbaise 2012-04-17 14:02:22

+0

您可以将该属性作为字符串公开,然后使用获取枚举的帮助器方法。这将隐藏所有的枚举值。 – 2012-04-17 14:05:15

+0

我闻到设计问题。 – JMelnik 2012-04-17 15:53:45

回答

1

注:我是EclipseLink JAXB (MOXy)的领导和JAXB 2 (JSR-222)专家组的成员。

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

COLORAdapter

我使用的XmlAdapterenum值转换为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(); 
    } 

} 

COLOR

XmlAdapter使用@XmlJavaTypeAdapter注释注册。如果您希望将适配器应用于所有COLOR实例,则可以在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。性能

的指定莫西为您的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>