JAXBElement поверх ArrayList? - PullRequest
       11

JAXBElement поверх ArrayList?

1 голос
/ 16 марта 2012

Как составить список элементов JAXBElement?

У меня есть одно POJO, которое я не могу комментировать, например:

public class APojo {

private String aString;

public APojo() { 
    super(); 
}

public String getAString() {
    return aString;
}

public void setAString(String aString) {
    this.aString = aString;
}
}

Так что я делаю это

APojo aPojo = new APojo();
aPojo.setaString("a string");       
JAXBElement<APojo> aJAXBedPojo = new JAXBElement<APojo>(new QName("apojo"), APojo.class, aPojo);

Что правильно маршалируется.

Тем не менее

List<JAXBElement<APojo>> list = new ArrayList<JAXBElement<APojo>>();

Не работает: когда я это делаю

JAXBContext context = JAXBContext.newInstance(APojo.class, ArrayList.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(list, System.out);

Время выполнения повышается:

[com.sun.istack.internal.SAXException2: unable to marshal type "java.util.ArrayList" as an element because it is missing an @XmlRootElement annotation]

Что нормально, поскольку ArrayList не аннотирован.

Я знаю, что могу создать обертку вокруг ArrayList и аннотировать ее с помощью @XmlRootElement, чтобы я мог упорядочить эту обертку.

Я ищу решение без такой обертки. Можно ли создать JAXBElement с T, являющимся ArrayList? Или что-то подобное?

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Я настоятельно рекомендую вам использовать XmlAdapter . Вы можете просто зарегистрировать адаптер у своего маршаллера, и он будет использовать ваш аннотированный класс адаптера вместо класса, который вы не можете аннотировать.

Кроме того, я думаю, что класс-обертка будет чище, чем пытаться что-то сделать без обертки.

Как говорится, если вы действительно хотите, вы можете попробовать следующее:

List<JAXBElement<APojo>> list = new ArrayList<JAXBElement<APojo>>();
JAXBElement<List<JAXBElement<APojo>>> listElement = new JAXBElement<List<JAXBElement<APojo>>>(new QName("apojolist"), List.class, list);
0 голосов
/ 05 мая 2013

Лучшее решение - создать оболочку, как объяснено здесь .

Поскольку моей целью было вернуть свой список из веб-службы REST, мне было еще проще заключить свой список в javax.ws.rs.core.GenericEntity , например

new GenericEntity<List<APojo>>(aPojo) {}
...