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 – Вероятно просто несигурност от моя страна наистина. Tnx за информацията :) Единственото нещо, за което се притеснявам досега, е този @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 структура, която търсите, трябва да направите лека корекция на вашия код. По принцип се нуждаете от обвиващ обект Includes, който ще има списък със стойности.

Ето моят код, който генерира 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