Как работать с Enum с помощью Generics в JAXB? - PullRequest
3 голосов
/ 31 августа 2010

Во время выполнения JAXB не удается создать JAXBContext для класса, переменная-член которого определяется как

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

Как обрабатывать такой сценарий в JAXB?

1 Ответ

3 голосов
/ 03 сентября 2010

Я согласен с 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;
    }

}

Ниже приведены два примера Enum, которые мы будем использовать в этом примере:

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

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

Нам нужно использовать XmlAdapter для свойства eenum. XmlAdapter должен знать обо всех возможных типах Enums, которые действительны для этого свойства.

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);
    }
}
...