Xstream: список с itemFieldName XStreamImplicit, но все еще завернутый в элемент

у меня есть этот класс

@XStreamAlias("myConfig")
public class MyConfig {
    ... // other properties

    // What do I put here? 
    private List<String> includes;
}

И я хочу этот вывод:

<myConfig>
    ...
    <includes>
        <includes>foo</include>
        <includes>bar</include>
    </includes>
</myConfig>

Это не работает, потому что элемент потерян:

    @XStreamImplicit(itemFieldName = "include") // Loses <includes> element
    private List<String> includes;

person Geoffrey De Smet    schedule 25.01.2013    source источник
comment
Поскольку ваш вопрос помечен jaxb, вас интересует решение JAXB (JSR-222)?   -  person bdoughan    schedule 25.01.2013
comment
@BlaiseDoughan Да, jaxb тоже: я мог бы подумать о переходе с xstream на jaxb в долгосрочной перспективе, потому что JAXB может генерировать XSD.   -  person Geoffrey De Smet    schedule 25.01.2013
comment
Отлично, я добавил ответ, демонстрирующий, как это можно сделать с реализацией JAXB (JSR-222): stackoverflow.com/a/14521810 /383861   -  person bdoughan    schedule 25.01.2013


Ответы (2)


Поскольку ваши вопросы отмечены тегом jaxb и на основе вашего комментарий.

@BlaiseDoughan Да, jaxb тоже: я мог бы подумать о переходе с xstream на jaxb в долгосрочной перспективе, потому что JAXB может генерировать XSD.

Вот как это будет выглядеть при использовании JAXB (JSR-222) реализация:

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class MyConfig {

    private List<String> includes;

    @XmlElementWrapper
    @XmlElement(name = "include")
    public List<String> getIncludes() {
        return includes;
    }

    public void setIncludes(List<String> includes) {
        this.includes = includes;
    }

}

Для получения дополнительной информации

person bdoughan    schedule 25.01.2013
comment
Отличный материал, особенно сравнение xstream и jaxb красивое :) Jaxb выглядит все более и более привлекательным. За рамками этого вопроса: мой единственный страх с JAXB заключается в том, что многие серверы приложений уже имеют версию jaxb, и мне нужно, чтобы мое приложение работало на старых серверах приложений при использовании только что выпущенной версии jaxb. Есть ли основания для этого страха? - person Geoffrey De Smet; 28.01.2013
comment
@GeoffreyDeSmet — некоторые серверы приложений предоставляют механизмы для переопределения используемой версии реализации JAXB. В качестве альтернативы, поскольку JAXB является стандартом (JSR-222), вы можете использовать другого поставщика (я руковожу EclipseLink JAXB (MOXy)). Есть ли конкретное расширение, которое вам нужно из последней версии? Не оценивайте уже включенную проверенную в бою версию. - person bdoughan; 28.01.2013
comment
BlaiseDoughan – Наверное, это просто неуверенность с моей стороны. Спасибо за информацию :) Единственное, о чем я пока беспокоюсь, это @XmlElementWrapper, jaxb, который мне нужен здесь и генерация XSD. В любом случае, я, вероятно, добавлю тест arquillian, чтобы увидеть, работает ли он на старых серверах приложений (JBoss 5, Jetty 6 и tomcat 6). - person Geoffrey De Smet; 28.01.2013
comment
@BlaiseDoughan Отличные ссылки! - person Zenil; 01.02.2013

Чтобы получить точную структуру xml, которую вы ищете, необходимо внести небольшие изменения в ваш код. В основном вам нужен объект-оболочка Включает, который будет иметь список значений.

Вот мой код, который генерирует xml

public class XSTreamAnnotTest {

    static class Includes {

        @XStreamImplicit(itemFieldName = "include")
        private List<String> include;

        Includes(List<String> include) {
            this.include = include;
        }
    }

    @XStreamAlias("myConfig")
    static class MyConfig {

        private Includes includes;

        public MyConfig(Includes includes) {
            this.includes = includes;
        }

    }

    public static void main(String args[]) throws Exception {
        XStream stream = new XStream();
        stream.processAnnotations(MyConfig.class);
        ArrayList<String> list = new ArrayList<String>();
        list.add("foo");
        list.add("bar");
        Includes cu = new Includes(list);

        MyConfig msg = new MyConfig(cu);
        System.out.println(stream.toXML(msg));
    }
}
person Zenil    schedule 01.02.2013
comment
Спасибо за ответ, этого я и опасался - необходимости в дополнительном классе :) - person Geoffrey De Smet; 04.02.2013