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

时间:2018-04-19 06:47:49

标签: java jaxb resttemplate jaxb2 jackson2

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

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

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

我尝试从这些类生成类。所以这样的宣言变成

@XmlType(name = "CustomerType", propOrder = {
    "field1",
    "field2"
})
public class CustomerType {
    ...

然后我需要使用此类来使用RestTemplate创建XML消息。问题是,XML消息中的对象不应该是“CustomerType”,它应该只是“Customer”。就像我说的,我无法编辑模式。我也无法直接编辑生成的源。我需要某种外部自定义来告诉源生成过程或编组过程如何转换对象的名称。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用绑定来自定义类或属性名称。通常,您会像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>

您可以使用绑定自定义一些内容(请参阅this),但肯定不是所有内容。

答案 1 :(得分:-1)

创建DTO对象的方式是:

您可以在一个地方定义所有类型,例如:CustomerType,UserType,OrderType等。

然后,您创建另一个架构并导入适当的XSD,在您定义多个类型的位置。然后,您实际使用/聚合这些类型定义来为对象创建XML模式。像下面的东西

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