JAXB模式与Java不同的XmlRootElement名称和类名

JAXB模式与Java不同的XmlRootElement名称和类名,jaxb,xsd,jaxb2-basics,annox,jaxb2-annotate-plugin,Jaxb,Xsd,Jaxb2 Basics,Annox,Jaxb2 Annotate Plugin,我有一个xsd模式,从中生成一些java类。我正在使用jaxb进行这一代 我希望能够生成一个用@XmlRootElement注释的类,但我希望@XmlRootElement name属性与生成的类的名称不同 在我的xsd中,我定义了以下内容: <xs:element name="customer"> <xs:complexType> <xs:sequence> .... </xs:sequence

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

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

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

<xs:element name="customer">
    <xs:complexType>
        <xs:sequence>
         ....
        </xs:sequence>
     </xs:complexType>
</xs:element>
@XmlRootElement
的name属性与生成的类的名称相同。我希望生成的类名是
CustomerReques
t

我尝试使用
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>
如何使
@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>

用于检查客户配置文件是否存在的操作的请求对象。

我建议您使用此绑定

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

现在可以在JAXB2注释插件中使用Java语法。类似于
@javax.xml.bind.annotation.XmlRootElement(name=“customer”,namespace=“yourNamespaceIfYouWant”)
的东西应该可以工作,而不是内部的
annox:annotate
元素。嗯,我知道了,您使用annox在类中注入注释。这可能会奏效,但似乎很棘手:p我将使用您发布的外部绑定和内部绑定来尝试您的解决方案。我更喜欢使用外部绑定来明确说明,java\JAXB独立于XSD。我同意java/JAXB之间的分离,但对于这种特定情况,我不希望为了使用外部绑定按节点匹配而处理xpath表达式。您的解决方案有效,我将使用内联绑定解决方案更新我的帖子,仅供参考。thksI使用了解决方案的一部分,即使用标记使工作变得重要。现在,您可以在JAXB2注释插件中使用Java语法。类似于
@javax.xml.bind.annotation.XmlRootElement(name=“customer”,namespace=“yourNamespaceIfYouWant”
)的内容应该可以工作,而不是内部的
annox:annotate
元素。(我是作者。)
 <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>
<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