Это не очевидно, я дам вам. Это сводится к решению типа против элемента.
Когда у вас есть что-то вроде
<xs:element name="rpcType">
<xs:complexType>
По сути, это «анонимный тип», и это тип, который никогда не может встречаться нигде, кроме как внутри элемента rpcType
. Из-за этой уверенности XJC знает, что этот тип всегда будет иметь имя rpcType
, и поэтому генерирует для него аннотацию @XmlRootElement
с именем rpcType
.
С другой стороны, когда у вас есть
<xs:complexType name="rpcType">
тогда это определяет тип многоразового использования, на который потенциально могут ссылаться несколько различных элементов. Тот факт, что в вашей схеме на него ссылается только один элемент, не имеет значения. Из-за этой неопределенности XJC хеджирует свои ставки и не генерирует @XmlRootElement
.
Эталонная реализация JAXB имеет собственный флаг XJC, называемый «режим простого связывания» , который, среди прочего, предполагает, что компилируемая схема никогда не будет расширена или объединена с другой. Это позволяет ему делать определенные предположения, поэтому, если он видит, что именованное complexType
используется только одним element
, то он часто генерирует @XmlRootElement
для него.
Реальность более тонкая и сложная, чем это, но в 90% случаев это достаточное объяснение.