JAXB将XML文档映射到Java Object

时间:2015-02-18 16:27:21

标签: 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: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>

我只有“type”字段有问题。当服务器回答JSON响应时,我有一个“类型”:“server_information”节点。因此映射正确地转换为Java。我可以调用方法foo.getType()并返回“server_information”。这是预期的行为。

当服务器回答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将根节点(“server_information”)的名称添加到“type”元素中? 我认为应该使用绑定文件(serverInformation.xjb)来完成,但我不知道该怎么做...

我还需要兼容JSON和XML。所以在JSON中,我仍然可以使用“类型”节点。

1 个答案:

答案 0 :(得分:0)

我通过删除&#34;类型&#34;解决了我的问题。我的xsd文件中的字段,并添加了包含XML根元素的Java注释。

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

@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 bindings file:

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