Как Marshal Java.util.list с JAXB, как JAX-RS (CXF, и Джерси), делают [дублировать

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

  •  26-09-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

Похоже, новейшие JAX-RS могут обрабатывать методы, возвращающие java.util.list как xmlRootelement, но обычный Jaxb не может. Я хотел бы имитировать, что делают CXF и Джерси.

Другими словами, я хотел бы маршал список и так же, как CXF и Джерси. Обычно, если вы пытаетесь маршал список с JAXB, вы получите исключение корневого элемента. Как мне обойти это, чтобы сделать обертованный объект?

Редактировать: Спасибо за многие ответы, но я очень знаком с @xmlelementwrapper, но это даже не приблизится к имитации того, что делает JAX-RS.

JAX-R делает это:

@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>

Таким образом, вы можете видеть, что я не хочу сделать объект обертки для каждого объекта домена.

Это было полезно?

Решение 7

Blaise Deeehan Я считаю, что это хорошее решение для этой проблемы здесь: Можно ли программно настроить JAXB?

и

http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html.

и несколько здесь хотя бы немного иное использование случая:

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

Другие советы

Не могли бы вы не просто добавить:

@XmlElementWrapper(name = "wrapperName")

Нет необходимости сделать объект обертки. Это тогда будет элемент маршрута в вашем Marshalled XML-ответе.

Я использовал пользовательский переключаемый список, используя следующий код, надеюсь, что это поможет.

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

У меня есть секрет, который позволяет мне полностью избежать сопоставлений JAXB и иметь все волшебным образом.

Использовали этот подход в течение многих лет, никогда не проводил даже 5 минут беспокоиться о маршаллировании / нежелании. Секрет .... не используйте JAXB. :)

В большинстве моих проектов, которые используют JAX-RS, я настроил Джерси, чтобы использовать XStream и пусть XStream определить, как для MEARSHAL / MENMARSHAL для меня. (или Джексон для JSON)

Возможно, есть некоторые причины использовать JAXB вместо чего-то вроде XStream / Jackson, но я еще не нашел.

сопоставление списка можно сделать подобное ..

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

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

  //getter setter
}

Проверьте Jackson Out, он очень совместим с помощью привязки JAXB и с использованием MappegejsonFactory, вы можете на самом деле взаимозаменяемо использовать Java в XML в Java в JSON для Java.

Я аннотирую свои коллекции с @XmlJavaTypeAdapter(value = Adapter.class)Отказ Класс адаптера простирается от XmlAdapter<key, value> Ключ является уникальным идентификатором (UN) Marshal, а значение - ваш объект домена.

Может быть, это может помочь вам. Однако вам нужно создать адаптер для каждого объекта домена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top