Aby powiązać to, co inni już stwierdzili lub podpowiedzieli, zasady, według których JAXB XJC decyduje, czy umieścić @XmlRootElement
adnotację w wygenerowanej klasie, nie są trywialne ( zobacz ten artykuł ).
@XmlRootElement
istnieje, ponieważ środowisko wykonawcze JAXB wymaga pewnych informacji w celu uporządkowania / odmarszowania danego obiektu, w szczególności nazwy elementu XML i przestrzeni nazw. Nie możesz po prostu przekazać Marshallerowi żadnego starego obiektu. @XmlRootElement
zapewnia tę informację.
Adnotacja to jednak tylko wygoda - JAXB jej nie wymaga. Alternatywą jest użycie JAXBElement
obiektów opakowania, które dostarczają tych samych informacji co @XmlRootElement
, ale w formie obiektu, a nie adnotacji.
Jednak JAXBElement
obiekty są trudne do zbudowania, ponieważ musisz znać nazwę elementu XML i przestrzeń nazw, czego zwykle nie zna logika biznesowa.
Na szczęście, gdy XJC generuje model klasy, generuje również klasę o nazwie ObjectFactory
. Ma to częściowo na celu zapewnienie kompatybilności wstecznej z JAXB v1, ale jest także miejscem, w którym XJC może umieszczać wygenerowane metody fabryczne, które tworzą JAXBElement
opakowania wokół twoich obiektów. Obsługuje dla Ciebie nazwę XML i przestrzeń nazw, więc nie musisz się o to martwić. Wystarczy przejrzeć ObjectFactory
metody (w przypadku dużego schematu mogą istnieć setki), aby znaleźć tę, której potrzebujesz.