2010-05-13 53 views
12

看来最新的JAX-RS可以处理返回的java.util.List作为XmlRootElement将的方法,但正常JAXB不能。 我想模仿CXF和泽西岛正在做的事情。如何元帅的java.util.List与JAXB喜欢JAX-RS(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

我认为这可能是答案https://jaxb.dev.java.net/guide/Different_ways_of_ma rshalling.html#Marshalling_a_non_element – 2010-05-13 15:11:04

+0

貌似我可以使用代码: org.apache.cxf.jaxrs.provider.AbstractJAXBProvider – 2010-05-13 15:46:36

+0

我的意思JAXBElementProvider – 2010-05-13 15:55:21

回答

6

你能不能简单地添加:

@XmlElementWrapper(name = "wrapperName") 

没有必要做一个包装对象。这将成为编组XML响应中的路由元素。

+0

是的,这是确保收藏包装的正确方法。使用@XmlElementWrapper按照https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlElementWrapper.html – 2014-11-25 00:34:14

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(); 
    } 
} 
0

映射表可以这样做..

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType 
public class TestRootObject { 

    @XmlElement(name = "testList") 
    private List<TestObj> testList; 

    //getter setter 
} 
2

我有一个秘密,让我可以完全避免与JAXB映射拧紧和拥有一切工作的神奇。

用这个方法好几年了,从来没有花连得5分担心编组/解组。秘诀是......不要使用JAXB。 :)

在我的大部分项目,其中使用JAX-RS的,我配置泽西使用XStream和让XStream的弄清楚如何编组/解组我。 (或杰克逊JSON)

也许有一些原因,而不是使用类似的XStream /杰克逊JAXB,但我还没有发现任何尚未。

+0

注释您的列表最近我只依靠Jackson JSON,忘记了XML共。 – 2012-05-03 02:18:22

0

检查杰克逊出来,它与JAXB绑定和使用MappingJsonFactory你其实可以互换使用Java XML和Java到JSON到Java非常兼容。

0

我用@XmlJavaTypeAdapter(value = Adapter.class)注释我的收藏。 Adapter类从XmlAdapter<key, value>扩展,该键是一个唯一的标识符(un)marshal,该值是您的域对象。

也许这可以帮助你。但是,您必须为每个域对象创建一个适配器。