Чтобы связать воедино то, что другие уже заявили или намекнули, правила, по которым JAXB XJC решает, помещать @XmlRootElement
аннотацию в сгенерированный класс, нетривиальны ( см. Эту статью ).
@XmlRootElement
существует, потому что среда выполнения JAXB требует определенной информации для маршалирования / демаршализации заданного объекта, в частности имени элемента XML и пространства имен. Вы не можете просто передать какой-нибудь старый объект маршаллеру. @XmlRootElement
предоставляет эту информацию.
Однако аннотация - это просто удобство - JAXB этого не требует. Альтернативой является использование JAXBElement
объектов-оболочек, которые предоставляют ту же информацию @XmlRootElement
, но в виде объекта, а не аннотации.
Однако JAXBElement
создавать объекты неудобно, поскольку вам необходимо знать имя элемента XML и пространство имен, чего обычно нет в бизнес-логике.
К счастью, когда XJC генерирует модель класса, он также генерирует класс с именем ObjectFactory
. Это частично для обратной совместимости с JAXB v1, но XJC также может предоставить сгенерированные фабричные методы, которые создают JAXBElement
обертки вокруг ваших собственных объектов. Он обрабатывает имя XML и пространство имен для вас, поэтому вам не нужно беспокоиться об этом. Вам просто нужно просмотреть ObjectFactory
методы (а для больших схем их может быть сотни), чтобы найти тот, который вам нужен.