提问人:Venkata 提问时间:11/17/2023 最后编辑:Venkata 更新时间:11/17/2023 访问量:22
Jaxb2 生成带有 @XMLRootElement 标签的类
Jaxb2 generate classes with @XMLRootElement tag
问:
我正在使用 Jaxb2 插件从 XSD 文件生成 JAVA 类文件
这是我的插件配置
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<id>parentA</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>
<source>src/test/resources/xsd/parent.xsd</source>
</sources>
<packageName>com.sample.generated</packageName>
<clearOutputDir>false</clearOutputDir>
</configuration>
</plugin>
这是我的示例 XSD 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xs:include schemaLocation="../contracts/childc.xsd"/>
<xs:include schemaLocation="../contracts/childa.xsd"/>
<xs:include schemaLocation="../contracts/childb.xsd"/>
<xs:element name="parent">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
<xs:documentation>Parent profile</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="birthPlace" type="xs:string"/>
<xs:element ref="childA"/>
<xs:element ref="childB"/>
<xs:element ref="childC"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我正在指定需要在 XSD 文件中使用以下配置生成的类文件的名称。
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
这是我试图取消Marshall的示例XML文件
<parentA>
<name>SAM</name>
<birthPlace>Dallas</birthPlace>
<childA>..</childA>
<childB>..</childB>
<childC>...</childC>
</parentA>
这是 un marshall 上面 XML 的逻辑
JAXBContext jaxbContext = JAXBContext.newInstance(parentA.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
parentA parentData = (parentA) jaxbUnmarshaller.unmarshal(xml.getBinaryStream());
//Assert on parentData
- 当我运行 jaxB2:XJC 时,会生成一个名称为“parentA”的 Java 文件
- 但是生成的文件在类顶部没有注释 @XmlRootElement(name =“parentA”)。
- 因此,在取消编组期间,我看到了一个错误。
问题:
- 我需要向 XSD 文件添加哪些附加配置,以便生成的 XML 文件具有@RootElement标记
答:
1赞
Laurent Schoelens
11/17/2023
#1
在 XSD 中删除以下内容可使其正常工作
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
您将生成以下类(但不具有所需的名称)。
@XmlRootElement(name = "parent")
public class Parent
由于您声明了 with name,因此应尝试取消封送以下 XMLxsd:element
parent
<parent>
<name>SAM</name>
<birthPlace>Dallas</birthPlace>
<childA>..</childA>
<childB>..</childB>
<childC>...</childC>
</parent>
针对没有元素的 ,进行了测试(因为在未提供的 XSD 中引用),unmarshall / marshall 成功使用 XML 标记名称。org.jvnet.jaxb:jaxb-maven-plugin
childX
parent
编组输出:context.createMarshaller().marshal(dto, System.out);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parent><name>SAM</name><birthPlace>Dallas</birthPlace></parent>
如果您仍然想要作为标签名称,则应将 XSD 中的名称标签从 更改为,其余部分仍将像上面一样工作,并替换为 .parentA
parent
parentA
parent
parentA
评论