JAXB игнорирует свойства HashMap?

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

Спецификация JAXB определяет специальную обработку для Map, когда она используется в качестве объекта bean. Например, следующий bean-компонент будет производить XML-файлы, подобные следующим:...

Это более или менее работает, если структура не имеет более одного уровня, то есть HashMap - это свойство компонента, которое является свойством компонента, например:

import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.JAXB;

class bean { 
    @XmlElement public HashMap<String,String> map;
}

@XmlRootElement class b2 { 
    @XmlElement public bean b;
}


class foo { 
    public static void main(String args[]) { 
        try { 
            bean b = new bean();
            b.map = new HashMap<String,String>();
            b.map.put("a","b");
            b2 two = new b2();
            two.b=b;
            JAXB.marshal(two, System.out);  

        } catch (Exception e) { 
            System.out.println("Exception: " + e.toString());
        }
    }
}

Это выводы<?xml version="1.0" encoding="UTF-8" standalone="yes"?><b2><b><map/></b></b2> вместо правильно отформатированного HashMap. Это работает, если я аннотирую bean с @XmlRootElement и удалите @XmlElement от mapНо я не понимаю, почему это необходимо. Это должно быть так?

1 ответ

Решение

Объяснение дано на сайте, на который вы ссылаетесь:

К сожалению, начиная с версии 2.1, эта обработка определяется только для свойств bean-компонента, а не когда маршал HashMap является объектом верхнего уровня (например, значением в JAXBElement.) В таком случае HashMap будет обрабатываться как Java-бин, а когда вы смотрите на HashMap как на bean-компонент, он не определяет пару свойств getter / setter, поэтому следующий код выдаст следующий XML:

Бин с картой:

m = new HashMap();
m.put("abc",1);
marshaller.marshal(new JAXBElement(new QName("root"),HashMap.class,m),System.out);

XML представление:

<root />

Эта проблема была зарегистрирована как #223, и исправление должно произойти в более поздних версиях спецификации JAXB.

Другие вопросы по тегам