Comment puis-je le maréchal java.util.List avec JAXB comme JAX-RS (CXF et Jersey) faire [double]

StackOverflow https://stackoverflow.com/questions/2827788

  •  26-09-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

Il semble que les dernières JAX-RS peut gérer des méthodes de retour java.util.List comme XMLRootElement mais JAXB normale ne peut pas. Je voudrais reproduire ce CXF et Jersey font.

En d'autres termes, je voudrais maréchal une liste et tout comme CXF et Jersey faire. Normalement, si vous essayez de rassembler une liste avec JAXB vous obtenez l'exception élément racine. Comment puis-je contourner ce sans avoir à faire un objet d'emballage?

EDIT: Merci pour les nombreuses réponses mais je suis très familier avec le @XmlElementWrapper mais qui ne vient même pas près de simuler ce JAX-RS est en train de faire

.

JAX-RS fait ceci:

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

Maintenant, si je sérialiser une liste de chiens:

serialize(List<Dog> dogs);

XML devrait être (ce JAX-RS fait):

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

Vous pouvez voir que je ne veux pas avoir à faire un objet wrapper pour chaque objet de domaine.

Était-ce utile?

La solution 7

Blaise Doughan Je crois que montre une bonne solution pour ce problème ici: est-il possible de configurer JAXB programme?

et

http: //blog.bdoughan .com / 2012/11 / création-liste générique-emballage en jaxb.html

et un peu ici même cas d'utilisation légèrement différente:

http://blog.bdoughan.com/2012/02 /xmlanyelement-and-xmladapter.html

Autres conseils

Pouvez-vous pas simplement ajouter:

@XmlElementWrapper(name = "wrapperName")

Pas besoin de faire un objet d'emballage. Ce sera alors l'élément d'itinéraire dans votre réponse XML Marshalled.

J'utilisé une liste itérables personnalisée en utilisant le code suivant, espérons que cette aide.

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

J'ai un secret qui me permet d'éviter le vissage avec des mappings JAXB entièrement et ont tout le travail comme par magie.

ont utilisé cette approche depuis des années, n'a jamais passé même 5 minutes inquiétant de marshalling / unmarshalling. Le secret est .... ne pas utiliser JAXB. :)

Dans la plupart de mes projets qui utilisent JAX-RS, configurer Jersey à utiliser xstream et laissez figure xstream comment le maréchal / unmarshal pour moi. (Ou Jackson pour JSON)

Peut-être qu'il ya des raisons d'utiliser JAXB au lieu de quelque chose comme Xstream / jackson, mais je n'ai pas encore trouvé.

mapper une liste peut être fait comme ça ..

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

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

  //getter setter
}

vérifier Jackson out, il est très compatible avec les liaisons JAXB et en utilisant MappingJsonFactory vous pouvez réellement utiliser de façon interchangeable Java pour XML à Java Json à Java.

J'annoter mes collections avec @XmlJavaTypeAdapter(value = Adapter.class). La classe adaptateur va de XmlAdapter<key, value> la clé est un identifiant unique au maréchal (un) et la valeur est votre objet de domaine.

Peut-être que cela peut vous aider. Cependant, vous ne devez créer un adaptateur pour chaque objet de domaine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top