java - 如何在 JAXB 中使用泛型处理枚举?

标签 java enums jaxb

JAXB 运行时无法为其成员变量定义为的类创建 JAXBContext

@XmlElement(name = "EnumeraatioArvo")
  private Enum<?> eenum;

如何在 JAXB 中处理这种情况?

最佳答案

我同意 skaffman这违背了枚举的目的。如果出于某种原因这是您需要做的事情,您可以尝试以下操作:

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Root {

    private Enum<?> eenum;

    @XmlJavaTypeAdapter(EnumAdapter.class)
    public Enum<?> getEenum() {
        return eenum;
    } 

    public void setEenum(Enum<?> eenum) {
        this.eenum = eenum;
    }

}

下面是我们将在此示例中使用的两个示例枚举:

public enum Compass {
    NORTH, SOUTH, EAST, WEST
}

public enum Suit {
    CLUBS, SPADES, DIAMONDS, HEARTS
}

我们需要在 eenum 属性上使用 XmlAdapter。 XmlAdapter 将需要了解对此属性有效的所有可能的枚举类型。

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class EnumAdapter extends XmlAdapter<String, Enum> {

    private Class[] enumClasses = {Compass.class, Suit.class};

    @Override
    public Enum unmarshal(String v) throws Exception {
        for(Class enumClass : enumClasses) {
            try {
                return (Enum) Enum.valueOf(enumClass, v);
            } catch(IllegalArgumentException  e) {
            }
        }
        return null;
    }

    @Override
    public String marshal(Enum v) throws Exception {
        return v.toString();
    }

}

您可以使用以下 XML 验证这是否有效:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <eenum>SPADES</eenum>
</root>

通过使用以下代码:

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }
}

关于java - 如何在 JAXB 中使用泛型处理枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3606973/

相关文章:

enums - Typescript 枚举,用于实现和接口(interface)

java - 如何让两个不同的端点具有不同的命名空间和相同的 JAXB 类?

java - 将字段编码为具有字段名称的子节点的值属性

java - 将 JPanel 设置为具有布局管理器时出现问题

java - Scala (java) grpc 异步拦截器状态传播

java - 将 JDBC 的结果集加载到二维表中

javascript - 如何在 jquery 中访问 java enum toString() 方法?

java - 使用 XML 键名访问值

c++ - 无作用域枚举是否仍然有用?

attributes - 使用下划线的 JAXB 属性