使用Java成员变量约定的JAXB封送器

使用Java成员变量约定的JAXB封送器,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我目前正试图弄清楚为什么JAXB marshaller使用Java成员变量约定而不是遵循XmlType注释 情况如下: 第三方给了我们XSD 我们使用JDK工具生成Java类 生成的Java类生成了正确的注释:@XmlType(name=“XML\u DOCUMENT\u TYPE”) 但是当我尝试将类封送回XML时,JAXB将其转换为,而不是 知道为什么吗?(如果是,我如何解决此问题?) 更新:为了澄清,问题发生在顶层/根级元素,而不是子元素/成员变量。更新(基于xandross的评论)

我目前正试图弄清楚为什么JAXB marshaller使用Java成员变量约定而不是遵循XmlType注释

情况如下:

  • 第三方给了我们XSD
  • 我们使用JDK工具生成Java类
  • 生成的Java类生成了正确的注释:@XmlType(name=“XML\u DOCUMENT\u TYPE”)
但是当我尝试将类封送回XML时,JAXB将其转换为
,而不是

知道为什么吗?(如果是,我如何解决此问题?)

更新:为了澄清,问题发生在顶层/根级元素,而不是子元素/成员变量。

更新(基于xandross的评论)

您可以使用
@XmlRootElement
控制根元素名称:

@XmlRootElement(name="XML_DOCUMENT_TYPE")
public class Foo {
  ...
}
或者,您可以将根对象包装在
JAXBElement
的实例中,以提供根元素信息


更新(基于穆罕默德·曼苏尔的评论)

在JAXB类中,p>对应于XML类型,字段/属性对应于XML属性/元素。当您认为存在地址类型:

时,这是有意义的。
<xs:complexType name="address">
    <xs:sequence>
        <xs:element name="street" type="xs:string"/>
    </xs:sequence>
</xs:complexType>


如果属性没有注释,它将被视为
@xmlmelement
,元素名从属性名派生而来。

嗨,Blaise,我相信他指的是他正在使用的子类型。例如,在他的主类型中,他有
私有SomeType xmlDocumentType;
,因此在这种情况下,他需要添加
@xmlmelement(name=“XML\u文档类型”)
在字段级别,因为JAXB使用的是字段名而不是
@XmlType
名称。@Mohamed Mansour-没错,我已经更新了我的答案。实际上我指的是根元素。子元素或字段很容易处理。对于缺少的信息,很抱歉。您能再解释一下使用JAXBElement包装器(如果可能的话,还有假定的输出)?谢谢!@xandross-这个例子演示了如何使用JAXBElement来提供根元素信息:
<xs:complexType name="customer">
    <xs:sequence>
        <xs:element name="billing-address type="address"/>
        <xs:element name="shipping-address type="address"/>
    </xs:sequence>
</xs:complexType>
@XmlElement(name="shipping-address")
public getShippingAddress() {
    return shippingAddress;
}
@XmlElement(name="ShippingAddress")
public getShippingAddress() {
    return shippingAddress;
}