如何让JAXB2生成带@XmlRootElement注解的Java类?
解决JAXB2生成类缺少@XmlRootElement注解的问题
要让XJC生成带@XmlRootElement(name="parentA")的类,你可以通过以下几种方式配置XSD或绑定文件:
方法1:内联绑定添加jaxb:rootElement
如果XSD中已定义对应全局复杂类型,直接在类型的绑定配置里添加<jaxb:rootElement>标签指定根元素名称:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> <xs:complexType name="ParentAType"> <!-- 你的类型定义内容 --> </xs:complexType> <!-- 绑定配置 --> <jaxb:bindings node="xs:complexType[@name='ParentAType']"> <jaxb:class name="ParentA"/> <!-- 强制生成@XmlRootElement注解 --> <jaxb:rootElement name="parentA"/> </jaxb:bindings> </xs:schema>
方法2:全局绑定配置自动生成注解
如果你的类型对应XSD全局元素(比如<xs:element name="parentA" type="ParentAType"/>),可以通过全局绑定让XJC为所有全局元素对应的类型自动生成@XmlRootElement:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> <!-- 全局绑定配置 --> <jaxb:globalBindings generateElementProperty="false"/> <xs:element name="parentA" type="ParentAType"/> <xs:complexType name="ParentAType"> <!-- 你的类型定义内容 --> </xs:complexType> <jaxb:bindings node="xs:complexType[@name='ParentAType']"> <jaxb:class name="ParentA"/> </jaxb:bindings> </xs:schema>
generateElementProperty="false"会让XJC不再为全局元素生成JAXBElement包装类,转而直接为对应类型添加@XmlRootElement注解。
方法3:使用外部绑定文件(大型项目推荐)
如果不想修改原XSD,可创建单独的绑定文件(比如bindings.xjb),内容如下:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <jaxb:bindings schemaLocation="your-schema.xsd" node="/xs:schema/xs:complexType[@name='ParentAType']"> <jaxb:class name="ParentA"/> <jaxb:rootElement name="parentA"/> </jaxb:bindings> </jaxb:bindings>
然后在jaxb2-maven-plugin的配置中指定该绑定文件:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <schemaFiles>your-schema.xsd</schemaFiles> <bindingFiles>bindings.xjb</bindingFiles> </configuration> </plugin>
注意事项
- 确保XSD中已正确声明jaxb命名空间(
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb")并指定版本(jaxb:version="2.1"或更高)。 - 如果你的类型被其他XSD元素引用为子类型,默认XJC不会自动生成@XmlRootElement,此时必须用
<jaxb:rootElement>强制指定。
内容的提问来源于stack exchange,提问作者Golden Heart
相关产品推荐
相关产品推荐

