注:我是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();
}
}
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>
我不这么认为,因为它没有任何意义。 – khmarbaise 2012-04-17 14:02:22
您可以将该属性作为字符串公开,然后使用获取枚举的帮助器方法。这将隐藏所有的枚举值。 – 2012-04-17 14:05:15
我闻到设计问题。 – JMelnik 2012-04-17 15:53:45