Jackson/JAXB сериализовать список без элемента-оболочки

Я пытаюсь использовать XML-аннотации Джексона для сериализации карты в XML. Я преобразовываю карту в список, чтобы использовать ключи карты в качестве имен элементов и значения в качестве значений элементов, и я так близок к получению желаемого XML.

Мой класс выглядит так:

@JacksonXmlRootElement(localName = "request")
public class TrackingEvent {
    private List<JAXBElement<String>> data = new ArrayList<JAXBElement<String>>();

    public TrackingEvent() {}

    public TrackingEvent addData(String key, String value) {
        data.add(new JAXBElement<String>(new QName(key), String.class, value));
        return this;
    }

    public Map<String, String> getData() {
        Map<String, String> dataAsMap = new HashMap<String, String>(data.size());
        for (JAXBElement<String> elem : data) {
            dataAsMap.put(elem.getName().getLocalPart(), elem.getValue());
        }
        return Collections.unmodifiableMap(dataAsMap);
    }
}

Мой тестовый код (быстрый и грязный, а не настоящий тест):

@RunWith(JUnit4.class)
public class TrackingEventMapperTest {

    @Test
    public void eventToXml() throws Exception {
        TrackingEvent e = new TrackingEvent().addData("eVar17", "woohoo");

        XmlMapper mapper = new XmlMapper();
        mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
        mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
        System.out.println("\n" + 
            mapper.writerWithDefaultPrettyPrinter().writeValueAsString(e));        
    }
}

И вот XML, который он генерирует:

<?xml version='1.0' encoding='UTF-8'?>
<request>
  <data>
    <eVar17>woohoo</eVar17>
  </data>
</request>

Но то, что я ищу, это:

<?xml version='1.0' encoding='UTF-8'?>
<request>
  <eVar17>woohoo</eVar17>
</request>

Я попытался добавить аннотацию @JacksonXmlElementWrapper(useWrapping = false) как к объявлению данных, так и к его получателю, но, похоже, это ничего не делает. Я могу изменить имя элемента, добавив @JacksonXmlProperty(localName = "moop") к объявлению/геттеру, но не могу понять, как его полностью исключить.

Я почти уверен, что смогу использовать аннотации JAXB, прочитав документацию Джексона, но через гугл там тоже ничего не нашел.

Как вы, наверное, догадались, я пытаюсь создать XML-документ, представляющий данные Omniture, и пытаюсь отправить все переменные eVar и prop таким образом, чтобы мне не нужно было явно включать их в мой POJO.

Мое решение

Я решил отказаться от любого использования Джексона, поскольку XML, который мне нужен, не такой сложный, но заставить Джексона делать то, что я хочу, становилось все сложнее. Я решил использовать STAX2 для прямого написания XML, используя ту же реализацию, которую Джексон использует скрыто. Это позволяет мне настраивать XML так, как я хочу.

Ответ Блейза, конечно, выглядел так, как будто он сделал бы именно то, что я хотел.


person Todd Hansberger    schedule 18.01.2013    source источник
comment
К вашему сведению. Вот как это можно сделать с помощью EclipseLink JAXB (MOXy): " title="jaxb маршалирует список массивов, созданный xmladapter"> stackoverflow.com/questions/13163430/   -  person bdoughan    schedule 22.01.2013
comment
Хмммм, я рассматривал возможность использования MOXy для этого, и похоже, что он будет делать именно то, что я хочу. Тем не менее, мы используем Nexus, чтобы помочь с нашими репозиториями Maven, и, по-видимому, есть обходные пути, позволяющие заставить Nexus получать JAR, и я не являюсь администратором Nexus и не чувствую себя комфортно, предлагая все изменения только для этого одного JAR. По сути, есть много дополнительной работы по добавлению MOXy JAR в ваш проект, что делает это решение бесполезным. Ну что ж.   -  person Todd Hansberger    schedule 22.01.2013
comment
Похоже, привязка XML-данных Джексона в версии 2.1.x должна позволять это.   -  person Todd Hansberger    schedule 20.02.2013