2010-08-31 4 views
2

exécution JAXB ne parvient pas à créer JAXBContext pour une classe dont la variable est définie comme membreComment gérer Enum avec Generics dans JAXB?

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

Comment gérer ce scénario dans JAXB?

+2

Est-ce pas cette défaite plutôt le point de énumérations? – skaffman

Répondre

3

Je suis d'accord avec skaffman que cela va à l'encontre du but sur enums. Si pour une raison quelconque cela est quelque chose que vous devez faire, vous pouvez essayer ce qui suit:

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

} 

Voici deux énumérations exemples que nous utiliserons dans cet exemple:

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

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

Nous avons besoin d'utiliser un XMLAdapter sur la propriété eenum. Le XmlAdapter devra connaître tous les types possibles d'Enums qui sont valides pour cette propriété.

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

} 

Vous pouvez vérifier cela fonctionne avec le code XML suivant:

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

En utilisant le code suivant:

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