Java 使用JAXB自定义对象/元素名称

Java 使用JAXB自定义对象/元素名称,java,jaxb,resttemplate,jaxb2,jackson2,Java,Jaxb,Resttemplate,Jaxb2,Jackson2,我是JAXB的新手,所以我很难破解这个我假设非常简单的用例 我有一套模式。我无法控制这些,我无法改变它们。在这些模式中,我有如下声明 <xs:complexType name="CustomerType"> ... 然后我需要使用这个类使用RestTemplate创建XML消息。问题是,XML消息中的对象不应该是CustomerType,而应该只是Customer。正如我所说,我无法编辑模式。我也不能直接编辑生成的源。我需要某种外部定制,告诉源生成过程或编组过程如何转换对象

我是JAXB的新手,所以我很难破解这个我假设非常简单的用例

我有一套模式。我无法控制这些,我无法改变它们。在这些模式中,我有如下声明

<xs:complexType name="CustomerType">
    ...

然后我需要使用这个类使用RestTemplate创建XML消息。问题是,XML消息中的对象不应该是CustomerType,而应该只是Customer。正如我所说,我无法编辑模式。我也不能直接编辑生成的源。我需要某种外部定制,告诉源生成过程或编组过程如何转换对象的名称。任何建议都将不胜感激。

创建DTO对象的方法是:

您可以在一个位置定义所有类型,如:CustomerType、UserType、OrderType等

然后创建另一个模式,并在其中导入适当的XSD,在其中定义了多个类型。然后实际使用/聚合这些类型定义来创建对象的XML模式。像下面这样

<xs:complexType name="CustomerOrders">
<xs:element name="Customer" type="CustomerType">
<xs:attribute name="Orders" type="OrderType">

可以使用绑定自定义类或属性名称。通常,您会有一个类似bindings.xjb的文件,如下所示:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc">

    <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
        <jaxb:bindings node="xsd:customType[@name='CustomerType']">
            <jaxb:class name="Customer"/>
        </jaxb:bindings>
        <jaxb:bindings node="xsd:customType[@name='CustomerType']//xsd:element[@name='field1']">
            <jaxb:property name="f1"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

您可以使用绑定自定义很多内容,请参见,但肯定不是所有内容。

我不明白您的建议。另外,我有一个xsd文件用于请求,一个文件用于响应每个服务。正如您提到的,您的请求和响应对象都有一个XSD,那么您的请求对象必须有一个xs:element,其类型为CustomerType。您是否可以共享您的请求XSD?我认为我无法共享XSD。但是是的,我有另一个包装器complexType。类似的东西在同一个文件中,我无法编辑。现在我需要将这些对象转换为单个和单个名称。你到底建议我做什么?这里很明显,个人姓名、出生日期是individualType对象的孩子,因此可以通过获取individualType对象的实例来使用。你需要搜索XSD来找到是否有任何complexType包装了individualType。好吧,原来我太无知了,问错了问题。因此,让我从头开始问:如何更改根complexType将被封送到的名称,而不更改模式或向生成的代码添加任何注释?谢谢。我看不到使用外部绑定文件自定义根对象的名称的方法—不仅是类,而且是将用于mashalling的名称,它位于@XmlType注释的name属性中。您确定必须为此更改@XmlType吗?这是可行的,但我怀疑Jackson是否真的需要@XmlType。我的措辞不正确。我的意思是我需要更改@XmlType定义的值。我实际上无法更改注释本身,因为它位于生成的源中。这就是为什么我在寻找一种方法来处理外部文件。@Sethiel好吧,你可能用词不正确,但现在它是按原样写的,这就是答案。@Sethiel我可以告诉你如何使用修改@XmlType,但首先让我们完成这个问题。接受答案,再问一个问题。
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jaxb:extensionBindingPrefixes="xjc">

    <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
        <jaxb:bindings node="xsd:customType[@name='CustomerType']">
            <jaxb:class name="Customer"/>
        </jaxb:bindings>
        <jaxb:bindings node="xsd:customType[@name='CustomerType']//xsd:element[@name='field1']">
            <jaxb:property name="f1"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>