JAXB 架构到 Java 不同的 XmlRootElement 名称和类名称

标签 jaxb xsd jaxb2-basics annox jaxb2-annotate-plugin

我有一个 xsd 模式,我从中生成一些 java 类。我正在使用 jaxb 作为一代。

我希望能够生成一个带有 @XmlRootElement 注释的类,但我希望 @XmlRootElement 名称属性与生成的类的名称不同。

在我的 xsd 中,我定义了以下内容:

<xs:element name="customer">
    <xs:complexType>
        <xs:sequence>
         ....
        </xs:sequence>
     </xs:complexType>
</xs:element>

这段代码生成以下 java 类:
@XmlRootElement(name = "customer")
public class Customer {
...
}
@XmlRootElement 的名称属性与生成的类的名称相同。我希望生成的类名是 CustomerReques吨。

我尝试使用 jaxb:class定义来改变类名。事实上,这个选项改变了类名,但删除了 @XmlRootElement注释,我需要它存在。

以下xsd:
<xs:element name="customer">
    <xs:complexType>
        <xs:annotation>
                <xs:appinfo>
                    <jaxb:class name="CustomerRequest"/>
                </xs:appinfo>
            </xs:annotation>
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>
</xs:element>

生成此类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer", propOrder = {

})
public class CustomerRequest {
}

如何使 @XmlRootElement 的属性名称注释与生成的类名不同而不会丢失注释?

解决方案更新:
用户 Xstian 提出了使用外部绑定(bind)的正确解决方案。
仅供引用,我将使用转换为使用内联绑定(bind)的解决方案更新我自己的帖子:
 <xs:element name="customer">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Request object for the operation that checks if a customer profile exists.</xs:documentation>
                <xs:appinfo>
                        <annox:annotate>
                            <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="customer"/>
                        </annox:annotate>
                        <jaxb:class name="CustomerRequest"/>
                    </xs:appinfo>
                </xs:annotation>
            <xs:sequence>
            </xs:sequece>
    </xs:complexType>
</xs:element>

最佳答案

我建议你使用这个绑定(bind)

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix">
    <bindings schemaLocation="../your.xsd">

        <bindings node="//xs:element[@name='customer']//xs:complexType">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                    name="customer" namespace="yourNamespaceIfYouWant">
                </annox:annotate>
            </annox:annotate>
            <class name="CustomerRequest"/>
        </bindings>

    </bindings>
</bindings>

类(class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "header"
})
@XmlRootElement(name = "customer", namespace = "yourNamespaceIfYouWant")
public class CustomerRequest

关于JAXB 架构到 Java 不同的 XmlRootElement 名称和类名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26544633/

相关文章:

java - 如何使用 jaxb2-maven-plugin 将 java 类生成到源文件夹中?

java - 使用 JAXB 使用 toString 映射元素

java - 如何停止 Marshaller 类在我的输出文件中添加 XML 标记

java - 使用 Java 进行 XML 解析(JAXB 和根元素)

java - 不区分大小写 Jaxb2Marshaller

xsd - xsd中的xml元素枚举属性和枚举值

php - 允许 xml :space ="preserve" in XSD for validation

java - hibernate SaxParseException

java - 使用 Mojo Jaxb2 maven 插件创建 Java 类时生成 hashCode() 和 equals()