【发布时间】:2014-07-29 07:39:30
【问题描述】:
JAXB 允许使用 @XMLEnum 注释直接从 XML 中定位 Enum 实例。
从@XMLEnumValue 定位值时,JAXB 似乎区分大小写。
但我面临一个问题,我需要以 不区分大小写 的方式定位 Enum 实例。 JAXB 是否以某种方式提供此功能? 如果没有这个,我会遇到手动定位枚举常量的问题。
我可以为此使用XMLAdapter,但是为每个创建的枚举维护一个适配器变得非常乏味。
编辑:
为什么必须以不区分大小写的方式定位枚举?
因为我正在使用 xml 来读取我的系统的配置,并且我不希望用户被限制在固定大小写。我希望这能回答你的问题。
public class CaseInsensitiveEnumAdapter<E extends Enum<E>> extends XmlAdapter<String, E> {
private final Class<E> clazz;
public CaseInsensitiveEnumAdapter(Class<E> clazz) {
this.clazz = clazz;
}
@Override
public E unmarshal(String v) throws Exception {
return Enum.<E>valueOf(clazz, v.toUpperCase().trim());
}
@Override
public String marshal(E v) throws Exception {
return v.name();
}
}
由于我需要 .class 用于枚举,因此我必须为所有枚举创建单独的适配器。
【问题讨论】:
-
为什么必须以不区分大小写的方式定位枚举?
-
@JamesB 我已经更新了帖子来回答你的问题。
-
如果不强制用户输入区分大小写的数据,您能否轻松识别 XML 文本内容中的枚举?如果是这样,您可以在将其提供给 JAXB 之前将其转换为大写。
-
另外,我不明白为什么不能为所有枚举值使用一个 XMLAdapter?你能把这段代码贴出来吗?
-
我相信这对于 JAXB 是不可能的。我想出于实际原因这是不可能的 - 在编组过程中会出现问题。对于枚举:
public enum DayOfWeek {MONDAY}假设有一个注释可以忽略枚举的大小写。这在解组期间会很好,因此“MonDAY”、“MONDAY”、“monday”都可以解析为 DayOfWeek.MONDAY。编组时,将编组的“版本”会有问题。也许您提供一个默认值进行编组的实现是可能的。但我不知道在 JAXB 中有任何解决此问题的方法。