2016-06-14 9 views
1

Ich versuche, eine JAXBContext-Resolver-Klasse zu implementieren. Was ich nicht verstehe ist, welche Arten von Klassen in cTypes enthalten sind? Ich habe einige ähnliche Beispiele gesehen, aber keine erklärt, was die cTypes-Liste ist.Implementieren einer JAXBContext-Resolver-Klasse: Welche Klassen sind in der Liste gespeichert?

@Provider 
public class JaxbContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 
    private final Set<Class<?>> types; 
    private final Class<?>[] cTypes = {Flights.class, FlightType.class, AircraftType.class}; 

    public JaxbContextResolver() throws Exception { 
     this.types = new HashSet<Class<?>>(Arrays.asList(cTypes)); 
     this.context = new JettisonJaxbContext(JettisonConfig.DEFAULT, cTypes); 
    } 

    @Override 
    public JAXBContext getContext(Class<?> objectType) { 
     return (types.contains(objectType)) ? context : null; 
    } 
} 

Antwort

1

Ihre ctypes Klassenliste muss enthält alle Klassen, die Root-XML-Elemente (diejenigen, die Sie mit @XmlRootElement kommentierten) darstellt.

Erläuterung:

Wenn Sie eine JAXBContext erstellen, können Sie eine Liste von Klassen gebunden geben:

this.context = new JettisonJaxbContext(JettisonConfig.DEFAULT, cTypes); 

Dadurch wird JAXB der Lage, tatsächlich ein Element mit einer Klasse zuordnen. JAXB bindet automatisch alle Klassen, die in den Stammelementklassen enthalten sind (mit Ausnahme der mit @XmlTransient annotierten Klassen).

Wenn dann die Methode getContext verwendet wird, wird der initialisierte Kontext in Ihrer Klasse nur zurückgegeben, wenn die Parameterklasse von JAXB an den Kontext gebunden wurde, da Ihr JAXBContext keine Klassen verwenden kann sind nicht gebunden.