使用JAXB和Jersey包装XML响应

时间:2015-11-19 12:12:01

标签: xml parsing jaxb jersey

我使用Jersey来实现我的REST API,我有以下服务:

@Path("discoverytopology")
public class DiscoveryTopology {

    @GET
    @Produces("application/xml")
    public List<Definition> getDefinitionList() {
        List<Definition> definitions = db.getDefinitions();
        return definitions;
    }
}

Definition类由XML注释注释,XML中的响应包含许多定义,如:

<defition body>
<defition body>
....

但是我想要这样的东西,我需要为XML中的每个定义提供一个ID,就像:

<DefinitionList>
    <definition id=1>
        <definition body>
    </definition>
    <definition id=2>
        <definition body>
    </definition>
    ............
</DefinitionsList>

我怎么做?

2 个答案:

答案 0 :(得分:0)

您需要一个对象,该对象将在一个将使用@XMLRootElelement注释的类中表示您的DefinitionList,并且它必须包含Definition的列表

JAX-B无法创建<DefinitionList>元素,除非它知道它存在。

然后,您需要正确注释Definition类,以便您的<definition>元素看起来像您想要的,属性与属性等。

我不确定你的<definition body> withtin <definition id="1">是否只是一个意味着“定义体”的填充物,但如果没有,那么在同一个内容中有2个具有不同定义的元素可能会变得棘手架构。不确定它是否是正确的XML。

答案 1 :(得分:0)

创建包装器

创建一个注释如下的DefinitionWrapper类:

@XmlRootElement(name = "DefinitionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class DefinitionWrapper {

    @XmlElement(name = "definition")
    private List<Definition> definitions;

    public List<Definition> getDefinitions() {
        return definitions;
    }

    public void setDefinitions(List<Definition> definitions) {
        this.definitions = definitions;
    }
}

确保Definition类注释如下:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {

    @XmlAttribute
    private Integer id;

    // Other fields

    // Getters and setters
}

并更改您的端点方法以返回DefinitionWrapper

@Path("discoverytopology")
public class DiscoveryTopology {

    @GET
    @Produces("application/xml")
    public DefinitionWrapper getDefinitionList() {
        List<Definition> definitions = db.getDefinitions();
        DefinitionWrapper definitionWrapper = new DefinitionWrapper;
        definitionWrapper.setDefinitions(definitions);
        return definitionWrapper;
   }
}

当封送到XML时,结果将是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
    <definition id="1"/>
    <definition id="2"/>
    <definition id="3"/>
</DefinitionList>

添加元素

您的id课程中可能需要除Definition之外的其他字段。例如,考虑一下,您需要一个description字段,它应该被封送为XML元素。

要实现此功能,请使用@XmlElement为您的字段添加注释,如下所示:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {

    @XmlAttribute
    private Integer id;

    @XmlElement
    private String description;

    // Getters and setters
}

当封送到XML时,结果将是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
    <definition id="1">
        <text>This is a description</text>
    </definition>
    <definition id="2">
        <text>This is a description</text>
    </definition>
    <definition id="3">
        <text>This is a description</text>
    </definition>
</DefinitionList>

添加值

您可以使用@XmlValue注释字段:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Definition implements Serializable {

    @XmlAttribute
    private Integer id;

    @XmlValue
    private String value;

    // Getters and setters
}

当您的对象被封送到XML时,结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DefinitionList>
    <definition id="1">This is the value</definition>
    <definition id="2">This is the value</definition>
    <definition id="3">This is the value</definition>
</DefinitionList>

但是,每个类只允许使用@XmlValue注释一个字段。如果某个类有任何使用@XmlElement注释的字段,则不能使用@XmlValue注释任何字段。