Jaxb2 生成带有 @XMLRootElement 标签的类

问题描述 投票:0回答:1

我正在使用 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>

这是我正在尝试解压缩的示例 XML 文件

<parentA>
    <name>SAM</name>
    <birthPlace>Dallas</birthPlace>
    <childA>..</childA>
    <childB>..</childB>
    <childC>...</childC>
</parentA>

这是对上面的 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 标记
java xml jaxb maven-jaxb2-plugin
1个回答
0
投票

删除 XSD 中的以下内容即可使其正常工作

<xs:appinfo>
   <jaxb:class name="ParentA"/>
</xs:appinfo>

您将生成以下类(但不是所需的名称)。

@XmlRootElement(name = "parent")
public class Parent

由于您使用

xsd:element
名称声明了
parent
,因此您应该尝试解组以下 XML

<parent>
    <name>SAM</name>
    <birthPlace>Dallas</birthPlace>
    <childA>..</childA>
    <childB>..</childB>
    <childC>...</childC>
</parent>

针对

org.jvnet.jaxb:jaxb-maven-plugin
进行测试,没有
childX
元素(因为未提供的 XSD 中的引用),使用 XML
parent
标记名称解组/编组成功。

编组输出:

context.createMarshaller().marshal(dto, System.out);

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parent><name>SAM</name><birthPlace>Dallas</birthPlace></parent>

如果您仍然想要

parentA
作为标签名称,您应该在 XSD 中将名称标签从
parent
更改为
parentA
,其余部分仍然像上面一样工作,将
parent
替换为
parentA

© www.soinside.com 2019 - 2024. All rights reserved.