JAXB unmarshall из списка в HashMap

250
07 августа 2018, 05:30

Есть такой кусок xml файла:

***
<resource>
        <name>commands</name>
        <method>POST</method>
        <permissions mode="blacklist"></permissions>
        <resource>
            <name>login</name>
            <permissions mode="blacklist"></permissions>
        </resource>
        <resource>
            <name>logout</name>
            <permissions>
                <u>$all</u>
                <u>BANNED</u>
            </permissions>
        </resource>
        <resource>
            <name>register</name>
            <permissions>
                <u>GUEST</u>
            </permissions>
        </resource>
        <resource>
            <name>addbook</name>
            <permissions>
                <u>$registered</u>
            </permissions>
        </resource>
        <resource>
            <name>changepassword</name>
            <permissions>
                <u>$registered</u>
            </permissions>
        </resource>
</resource>
***

Как видно, в нем теги могут быть вложены друг в друга, причем по несколько штук. И вложенные не находятся в теге , а просто один за одним списком.

На данный момент с помощью JAXB они преобразовываются в List. Но у меня появилась необходимость вместо списка иметь HashMap:

class Resource{
***
    private HashMap<String, Resource> resources;
    @XmlJavaTypeAdapter(ResourcesHashMapAdapter.class)
    @XmlElement(name = "resource")
    public HashMap<String, Resource> getResources() {
        return resources;
    }
    public void setResources(HashMap<String, Resource> resources) {
        this.resources = resources;
    }
***
}

Для этого написал адаптер, который при демаршаллизации принимает список и возвращает map, но это не работает.

public class ResourcesHashMapAdapter extends XmlAdapter<LinkedList<Resource>, HashMap<String, Resource>> {
    @Override
    public HashMap<String, Resource> unmarshal(LinkedList<Resource> v) throws Exception {
        HashMap<String, Resource> map = new HashMap<String, Resource>();
        v.forEach(resource -> map.put(resource.getName(), resource));
        System.out.println("IN ResourcesHashMapAdapter: " + v);
        return map;
    }
    @Override
    public LinkedList<Resource> marshal(HashMap<String, Resource> v) throws Exception {
        return new LinkedList(v.values());
    }
}

unmarshall() вызывается, но ему постоянно приходит пустой LinkedList. Что нужно исправить, чтобы происходило правильное преобразование?

Проблема в том, что хотелось бы обойтись без оборачивания в доп. тег

READ ALSO
map.containsKey возвращает false [дубликат]

map.containsKey возвращает false [дубликат]

На данный вопрос уже ответили:

241
Помогите сделать парсер txt ответа из itunes store

Помогите сделать парсер txt ответа из itunes store

Есть апи для запросов: https://wwwapple

212
Как удалить конкретный Point в библиотеке yandex map kit 3.0?

Как удалить конкретный Point в библиотеке yandex map kit 3.0?

Всем добрый день, добавляю метку (point) на карту, после нажатия на кнопку определения местоположения эта метка должна удалиться и добавиться...

256
В каком слое должен происходить парсинг Json в Java модель?

В каком слое должен происходить парсинг Json в Java модель?

Использую(на сколько себе ее представляю) Mvp и чистую архЗагвоздка в следующем, в data слое есть репозиторий который получает http_clenta(retrofit) и идёт...

240