Щоб пов’язати разом те, що інші вже заявили чи натякнули, правила, за якими JAXB XJC вирішує, ставити @XmlRootElementанотацію до сформованого класу, є нетривіальними ( див. Цю статтю ).
@XmlRootElementіснує тому, що час виконання JAXB вимагає певної інформації для маршалки / зняття маршалу певного об'єкта, зокрема імені XML та простору імен. Ви не можете просто передати будь-який старий об’єкт Маршаллеру. @XmlRootElementнадає цю інформацію.
Анотація - це лише зручність, однак JAXB цього не вимагає. Альтернативою є використання JAXBElementоб’єктів обгортки, які надають ту саму інформацію @XmlRootElement, що й у формі об'єкта, а не примітки.
Однак JAXBElementоб'єкти незручно будувати, оскільки вам потрібно знати ім'я та простір XML-елементів, яких бізнес-логіка зазвичай не має.
На щастя, коли XJC генерує модель класу, він також генерує клас під назвою ObjectFactory. Частково це існує для зворотної сумісності з JAXB v1, але це також є місцем для XJC, щоб розмістити генеровані фабричні методи, які створюють JAXBElementобгортки навколо власних об'єктів. Він обробляє для вас ім'я XML і простір імен, тому вам не потрібно турбуватися про це. Вам просто потрібно переглянути ObjectFactoryметоди (а для великих схем їх може бути сотні), щоб знайти потрібний.