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