JAXB将XML文档映射到Java对象

JAXB将XML文档映射到Java对象,java,xml,jaxb,cxf,wadl,Java,Xml,Jaxb,Cxf,Wadl,我正在尝试为REST服务制作一个简单的客户端示例。 服务器可以用XML和JSON发送响应。我无法更改服务器的行为 我声明了我的元素: <xsd:complexType name="ServerInformation"> <xsd:sequence> <xsd:element name="type" type="xsd:string"/> <xsd:element name="name" type="xsd:

我正在尝试为REST服务制作一个简单的客户端示例。 服务器可以用XML和JSON发送响应。我无法更改服务器的行为

我声明了我的元素:

    <xsd:complexType name="ServerInformation">
    <xsd:sequence>
        <xsd:element name="type" type="xsd:string"/>
        <xsd:element name="name" type="xsd:string" />
        <xsd:element name="version" type="xsd:string" />
        <xsd:element name="zone" type="xsd:string" />
        <xsd:element name="date" type="xsd:dateTime" />
        <xsd:element name="timeout" type="xsd:int" />
    </xsd:sequence>
</xsd:complexType>
我只有类型字段有问题。当服务器响应JSON时,我有一个类型:server\u information节点。因此,映射被正确地制作成Java。我可以调用foo.getType方法,它返回服务器信息。这是预期的行为

当服务器使用XML响应进行应答时,我也希望这样做。问题是我没有命名为type的节点。类型值包含在XML应答的根节点中。 下面是XML的答案:

<server_information>
      <name>Server Name</name>
      <version>[development build]</version>
      <zone>Europe/Paris</zone>
      <date>2015-02-18T16:15:35.892Z</date>
      <timeout>300</timeout>
</server_information>
我对其他元素名称、版本、区域的映射没有任何问题。。。。仅限于类型

因此,我的问题是,如何指定JAXB将根节点服务器的名称信息输入到type元素中? 我认为应该使用绑定文件serverInformation.xjb来完成,但我不知道如何做到这一点


我还需要与JSON和XML兼容。因此,在JSON中,我仍然可以使用类型节点。

我通过删除xsd文件中的类型字段并添加包含XML根元素的Java注释来解决问题

现在,我可以使用此注释的值获取类型。我的所有实体都使用getType方法扩展了一个抽象类

@XmlRootElement(name = "server_information")
public class ServerInformation extends AbstractEntityBase
{...}
每个实体的抽象类:

public abstract class AbstractEntityBase{

public final String getType(){
    return getClass().getAnnotation(XmlRootElement.class).name();
}
}

xsd文件:

    <xsd:complexType name="server_information">
    <xsd:sequence>
        <xsd:element name="version" type="xsd:string" />
        <.../>
    </xsd:sequence>
</xsd:complexType>
xsd绑定文件:

    <jaxb:bindings schemaLocation="ServerInformation.xsd" node="/xsd:schema/xsd:complexType[1]">

    <annox:annotate target="class">
        @javax.xml.bind.annotation.XmlRootElement(name = "server_information")
    </annox:annotate>

    <annox:annotate target="class">
        @com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true, value = {"type"})
    </annox:annotate>

    <jaxb:globalBindings>
        <xjc:superClass name="com.foo.AbstractEntityBase" />
    </jaxb:globalBindings>
</jaxb:bindings>

您是否尝试对XML和JSON使用相同的JAXB对象?如果需要,我可以对WADL描述使用单独的文件,但在Java中,我只需要一个包含所有字段的对象。JSON对象已经是正确的了,我只需要能够获取XML文件的根名称并将其放入字段类型中。我会选择JSON或XML,并坚持这一点。如果你正在制作一个客户样本,只需制作两种类型中的一种。服务器是否尊重Accept:头?是,服务器接受Accept头。我当前的项目只是一个示例,但我必须实现一个真正的客户端,然后才能选择XML或JSON格式。是的,所以我建议创建一个真正的客户端,只使用您喜欢的格式。