在寻找其他东西时发现了这个问题,但我读了你对更通用的东西的评论。以下是我一直用于将大写枚举类型转换为驼峰大小写的内容。我将使用您的类型,但将我的适配器放在上面。如您所见,您不需要引用限定符的每个实例,而只需注释枚举本身即可。enum
CamelCaseEnumAdapter可以采用任何一个,但是类必须传递给它,因此你需要有一个类来扩展它,我只是在枚举本身中使用一个私有静态类。enumenum
枚举:
@XmlJavaTypeAdapter(Qualifier.Adapter.class)
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;
    }
    private static class Adapter extends CamelCaseEnumAdapter<Qualifier> {
        public Adapter() {
            super(Qualifier.class, FOO);
        }
    }
}
适配器
public abstract class CamelCaseEnumAdapter<E extends Enum> extends XmlAdapter<String, E>{
    private Class<E> clazz;
    private E defaultValue;
    public CamelCaseEnumAdapter(Class<E> clazz) {
        this(clazz, null);
    }
    public CamelCaseEnumAdapter(Class<E> clazz, E defaultValue) {
        this.clazz = clazz;
        this.defaultValue = defaultValue;
    }
    @Override
    @SuppressWarnings("unchecked")
    public E unmarshal(String v) throws Exception {
        if(v == null || v.isEmpty())
            return defaultValue;
        return (E) Enum.valueOf(clazz, v.replaceAll("([a-z])([A-Z])", "$1_$2").toUpperCase());
    }
    @Override
    public String marshal(E v) throws Exception {
        if(v == defaultValue)
            return null;
        return toCamelCase(v.name());
    }
    private String toCamelCase(String s){
       String[] parts = s.split("_");
       String camelCaseString = "";
       for (String part : parts){
           if(camelCaseString.isEmpty())
               camelCaseString = camelCaseString + part.toLowerCase();
           else
               camelCaseString = camelCaseString + toProperCase(part);
       }
       return camelCaseString;
    }
    private String toProperCase(String s) {
        return s.substring(0, 1).toUpperCase() +
                   s.substring(1).toLowerCase();
    }
}