Wie kann ich Marschall java.util.List mit JAXB wie JAX-RS (CXF und Jersey) zu tun [Duplikat]

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

  •  26-09-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Es scheint, die neueste JAX-RS Methoden Rückkehr java.util.List als XMLRootElement umgehen kann, aber normalen JAXB kann es nicht. Ich möchte imitieren, was CXF und Jersey tun.

Mit anderen Worten möchte ich Marschall wie eine Liste und wie CXF und Jersey tun. Normalerweise eine Liste mit JAXB Marschall, wenn Sie versuchen, erhalten Sie die Ausnahme Root-Element. Wie bekomme ich diese herum mit, die aus einem Wickel Objekt zu machen?

EDIT: Danke für die viele Antworten, aber ich bin sehr vertraut mit dem @XmlElementWrapper aber das nicht einmal nahe kommen zu simulieren, was JAX-RS tut

.

JAX-RS tut dies:

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

Wenn ich nun eine Liste von Hunden serialisiert:

serialize(List<Dog> dogs);

XML sollte (was JAX-RS der Fall ist):

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

So können Sie sehen, ich möchte nicht ein Wrapper-Objekt für jede einzelne Domain-Objekt haben, zu machen.

War es hilfreich?

Lösung 7

Andere Tipps

Könnten Sie nicht einfach hinzufügen:

@XmlElementWrapper(name = "wrapperName")

Keine Notwendigkeit, ein Wrapper-Objekt zu machen. Dies wird dann die Route Element in Ihrer Marshalled XML-Antwort.

Ich habe eine benutzerdefinierte iterable Liste mit dem folgenden Code, hoffe, das hilft.

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

Ich habe ein Geheimnis, das mir völlig mit JAXB Mappings Verschrauben zu vermeiden erlaubt und alles funktioniert magisch hat.

verwendet haben diesen Ansatz seit Jahren, nicht einmal 5 Minuten verbrachte sich Gedanken über Rangier- / unmarshalling. Das Geheimnis ist .... nicht JAXB verwenden. :)

In den meisten meiner Projekte, die JAX-RS zu verwenden, konfigurieren I Jersey zu verwenden xstream und lassen xstream herauszufinden, wie Marschall / Abstellungs für mich. (Oder jackson für JSON)

Vielleicht gibt es einige Gründe, JAXB zu verwenden, anstatt etwas wie xstream / Jackson, aber ich habe festgestellt, noch kein.

Abbildung einer Liste kann wie folgt ..

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

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

  //getter setter
}

überprüfen Jackson heraus, es mit JAXB Bindungen sehr kompatibel ist und MappingJsonFactory verwenden Sie können tatsächlich austauschbar verwenden Java XML in Java zu Json zu Java.

I mit Anmerkungen versehen meine Sammlung mit @XmlJavaTypeAdapter(value = Adapter.class). Die Adapterklasse reicht von XmlAdapter<key, value> der Schlüssel ist eine eindeutige Kennung zu (un) Marschall und der Wert Ihrer Domain-Objekt.

Vielleicht kann dieser Ihnen helfen. Allerdings haben Sie einen Adapter für jede Domain-Objekt erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top