使用Jersey构建XML响应

ZKS*_*fel 2 java xml jersey

我正在尝试构建一个Jersey Web服务,它将接收数据,将其格式化为XML文档,然后将其传递给另一个服务.我意识到Jersey确实有XML支持,但由于项目所需的XML结构,我在实现它时遇到了一些麻烦.所需的输出看起来像这样:

<root-element>
    <table>
        <row>
            <d>data1</d>
            <d>data2</d>
            <d>data3</d>
        </row>
        <row>
            <d>data4</d>
            <d>data5</d>
            <d>data6</d>
        </row>
    </table>
Run Code Online (Sandbox Code Playgroud)

我的问题出现了,有一些变量<d><row>元素,它们将根据传入的数据确定.我知道我可以@XmlRootElement在处理数据的类之上格式化一个简单的表,但这可能只对我<root-element>的元素只会填充其他元素.我知道我需要使用某种循环来创建每个<row>,但我不确定如何<d>在每个字段中创建具有不同数据的每个元素.有什么建议?

bdo*_*han 5

您可以使用带有JAXB(JSR-222)注释的Java模型来支持您的用例.可能出现多次的元素将对应List于Java模型中的属性.下面是如何映射文档的示例.

我们将使用@XmlElementWrapper注释添加分组元素,并使用@XmlElement注释来设置集合中项目的元素名称.

package forum11543081;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="root-element")
@XmlAccessorType(XmlAccessType.FIELD)
public class Table {

    @XmlElementWrapper(name="table")
    @XmlElement(name="row")
    private List<Row> rows;

}
Run Code Online (Sandbox Code Playgroud)

如果属性/字段的名称与生成的XML元素的名称匹配,则不需要任何注释.

package forum11543081;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Row {

    private List<String> d;

}
Run Code Online (Sandbox Code Playgroud)

演示

下面是一个独立的示例来证明映射有效:

package forum11543081;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Table.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11543081/input.xml");
        Table table = (Table) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(table, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

input.xml中/输出

<root-element>
    <table>
        <row>
            <d>data1</d>
            <d>data2</d>
            <d>data3</d>
        </row>
        <row>
            <d>data4</d>
            <d>data5</d>
            <d>data6</d>
        </row>
    </table>
</root-element>
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息