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