【问题标题】:JAXB schema to Java Different XmlRootElement name and Class nameJAXB 模式到 Java 不同的 XmlRootElement 名称和类名称
【发布时间】:2014-10-24 08:57:39
【问题描述】:

我有一个 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 的 name 属性与生成的 Class 的名称相同。我希望生成的类名是CustomerRequest。

我尝试使用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 提出了使用外部绑定的正确解决方案。 仅供参考,我将使用转换为使用内联绑定的解决方案更新我自己的帖子:

 <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>

【问题讨论】:

  • 您现在可以在 JAXB2 Annotate 插件中使用 Java 语法。 @javax.xml.bind.annotation.XmlRootElement( name="customer", namespace="yourNamespaceIfYouWant") 之类的东西应该代替内部的 annox:annotate 元素起作用。 (我是作者。)

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


【解决方案1】:

我建议你使用这个绑定

<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>

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

【讨论】:

  • 您现在可以在 JAXB2 注释插件中使用 Java 语法。像 @javax.xml.bind.annotation.XmlRootElement( name="customer", namespace="yourNamespaceIfYouWant") 这样的东西应该可以代替内部的 annox:annotate 元素。
  • 嗯,我明白了,您使用 annox 在类中注入注释。这可能有效,但似乎很棘手:p 我将使用您发布的外部绑定和内部绑定尝试您的解决方案
  • 我更喜欢外部绑定以明确和 java\JAXB 独立于 XSD。
  • 我同意 java/jaxb 之间的分离,但对于这种特定情况,我不想处理 xpath 表达式以便使用节点匹配的外部绑定。您的解决方案有效,我将使用内联绑定解决方案更新我的帖子,仅供参考。谢谢
  • 我使用您的解决方案的一部分,使用 标签来导入工作
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
相关资源
最近更新 更多