是否有JAXB注释允许我们使用枚举隐藏某些值?
例如,如果我想在以下枚举中隐藏值BLUE:
public enum COLOR {
RED,
YELLOW,
GREEN,
@SomeAnnotation
BLUE
}
有没有办法按规格执行此操作?
编辑: 一些评论者提到这个想做的事没有意义。我(尊敬地)不同意。在JAXB / Web服务领域有先例。这是我想到的情况:
使用Java-First Web服务设计,类和枚举直接转换为XSD并通过Web服务公开。现在可能存在我们想要从Web服务中隐藏某些(敏感?)数据的情况,但是可以让它直接用于访问代码的库。对于类字段,JAXB提供了一个@XmlTransient注释来隐藏不应该通过Web服务公开的字段 - 只有这样才能对枚举值存在这种需求。
答案 0 :(得分:1)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。
以下示例适用于EclipseLink JAXB(MOXy),但似乎在我使用的JDK(Oracle JDK 1.6.0_29)中包含的JAXB版本中引发异常。
<强> COLORAdapter 强>
我使用XmlAdapter
将enum
值转换为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
}
<强>富强>
以下是具有三个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>