我如何像JAX-RS(CXF和Jersey)一样用JAXB封送java.util.List。

2022-09-04 20:30:53

似乎最新的 JAX-RS 可以处理返回 java.util.List 作为 XMLRootElement 的方法,但普通的 JAXB 不能。我想模仿CXF和泽西岛正在做的事情。

换句话说,我想整理一个列表,就像CXF和泽西岛一样。通常,如果您尝试使用 JAXB 封送列表,则会出现根元素异常。我如何解决这个问题而不必制作包装对象?

编辑:感谢许多答案,但我非常熟悉@XmlElementWrapper但这甚至没有接近模拟JAX-RS正在做的事情。

JAX-RS 这样做:

@XmlRootElement(name="dog")
public class Dog {
    private String name;
    public String getName() { return this.name; }
    //Setter also
}

现在,如果我序列化狗的列表:

serialize(List<Dog> dogs);

XML 应该是(JAX-RS 所做的):

<dogs>
    <dog><name>Rascal</name></dog>
</dogs>

所以你可以看到我不想为每个域对象创建一个包装器对象。


答案 1

你能不能简单地补充一下:

@XmlElementWrapper(name = "wrapperName")

无需创建包装器对象。然后,这将是封送的 XML 响应中的路由元素。


答案 2

我使用以下代码使用了自定义可迭代列表,希望这有帮助。

package bindings;

import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlType
@XmlRootElement
public class CustomBindList<V> implements Iterable<V>, Serializable {
        private static final long serialVersionUID = 4449835205581297830L;

        @XmlElementWrapper(name = "List")
        @XmlElement(name = "Entry")
    private final List<V> list = new LinkedList<V>();

    public CustomBindList() {
    }

    public void add(final V obj) {
            list.add(obj);
    }

    public V get(final int index) {
        return list.get(index);
    }

    @Override
    public Iterator<V> iterator() {
        return list.iterator();
    }

    public int size() {
        return list.size();
    }
}

推荐