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