对于我正在进行的一个项目,我们使用了很多枚举。模型对象本身是由很多小类组成的;然后我们通过 JAXB 将这个模型作为 XML 序列化到我们的数据库中。现在,我们希望能够使用枚举中特定方法的返回来序列化我们的枚举值;这是给定的:
public enum Qualifier {
FOO("1E", "Foo type document"),
BAR("2", "Bar object");
private String code, description;
public Qualifier(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return this.code;
}
public String getDescription() {
return this.description;
}
}
等等。等等。目前,当序列化为 XML 时,我们会得到类似:
<qualifier>FOO</qualifier>
这就是 JAXB 处理它的方式。但是,我们需要将值作为 getCode() 的返回值,并且我们的很多枚举都遵循该约定(通过代码查找相应的静态方法),因此上述 XML 片段如下所示:
<qualifier>1E</qualifier>
相反。我们可以用 @XmlEnum
和 @XmlEnumValue
来注解它,但这太繁琐了——有些枚举有多达 30 个枚举值,手工编辑不好。我们也在考虑使用自定义序列化程序,但我现在想避免走这条路(但如果这是要走的路,那么我没有问题)。
有什么想法吗?
最佳答案
尝试为此使用 XmlAdapter
机制。您为每个枚举类型创建一个 XmlAdapter
子类,它知道如何将枚举编码/解码到 XML。
然后将适配器与属性关联,例如
public class QualifierAdapter extends XmlAdapter<String, Qualifier> {
public String marshal(Qualifier qualifier) {
return qualifier.getCode();
}
public Qualifier unmarshal(String val) {
return Qualifier.getFromCode(val); // I assume you have a way of doing this
}
}
然后在模型类中:
@XmlJavaTypeAdapter(QualifierAdapter.class)
private Qualifier qualifier;
您也可以在包级别声明它,在与模型类位于同一包中的名为 package-info.java
的文件中,使用相当特殊的包注释:
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(
type=Qualifier.class, value=QualifierAdapter.class
)
})
package com.xyz;
关于java - 通过 JAXB 为枚举提供自定义值序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656992/