2010-05-13 142 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,該值是您的域對象。

也許這可以幫助你。但是,您必須爲每個域對象創建一個適配器。