Aby powiązać to, co inni już stwierdzili lub podpowiedzieli, zasady, według których JAXB XJC decyduje, czy umieścić @XmlRootElementadnotację w wygenerowanej klasie, nie są trywialne ( zobacz ten artykuł ).
@XmlRootElementistnieje, 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. @XmlRootElementzapewnia tę informację.
Adnotacja to jednak tylko wygoda - JAXB jej nie wymaga. Alternatywą jest użycie JAXBElementobiektów opakowania, które dostarczają tych samych informacji co @XmlRootElement, ale w formie obiektu, a nie adnotacji.
Jednak JAXBElementobiekty 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ą JAXBElementopakowania wokół twoich obiektów. Obsługuje dla Ciebie nazwę XML i przestrzeń nazw, więc nie musisz się o to martwić. Wystarczy przejrzeć ObjectFactorymetody (w przypadku dużego schematu mogą istnieć setki), aby znaleźć tę, której potrzebujesz.